]> git.wh0rd.org - fontconfig.git/commitdiff
Fix autoconf build process for fontconfig
authorKeith Packard <keithp@keithp.com>
Tue, 21 May 2002 17:06:22 +0000 (17:06 +0000)
committerKeith Packard <keithp@keithp.com>
Tue, 21 May 2002 17:06:22 +0000 (17:06 +0000)
18 files changed:
config/Makedefs.in [new file with mode: 0644]
config/config.guess [new file with mode: 0644]
config/config.sub [new file with mode: 0644]
config/install.sh [new file with mode: 0644]
fc-cache/Imakefile
fc-cache/Makefile.in [new file with mode: 0644]
fc-cache/fc-cache.c
fc-list/Makefile.in [new file with mode: 0644]
fontconfig/fontconfig.h
src/Makefile.in [new file with mode: 0644]
src/fccache.c
src/fccfg.c
src/fcdir.c
src/fcinit.c
src/fcint.h
src/fclist.c
src/fcstr.c
src/fcxml.c

diff --git a/config/Makedefs.in b/config/Makedefs.in
new file mode 100644 (file)
index 0000000..b304379
--- /dev/null
@@ -0,0 +1,68 @@
+#
+# $XFree86$
+#
+# Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of Keith Packard not be used in
+# advertising or publicity pertaining to distribution of the software without
+# specific, written prior permission.  Keith Packard makes no
+# representations about the suitability of this software for any purpose.  It
+# is provided "as is" without express or implied warranty.
+#
+# KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+# EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, 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.
+#
+
+SHELL = @SHELL@
+
+srcdir=@srcdir@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+bindir=@bindir@
+datadir=@datadir@
+includedir=@includedir@
+sysconfdir=@sysconfdir@
+
+CDEBUGFLAGS=@CFLAGS@
+CPPFLAGS=@CPPFLAGS@
+DEFS=@DEFS@
+
+DSO_LDOPTS=@DSO_LDOPTS@
+DSO_CFLAGS=@DSO_CFLAGS@
+DSO_PIC_CFLAGS=@DSO_PIC_CFLAGS@
+
+INCLUDES=-I$(TOPDIR) -I$(srcdir)
+
+CFLAGS=$(CDEBUGFLAGS) $(INCLUDES) $(DEFS) $(CPPFLAGS)
+
+INSTALL=@INSTALL@
+INSTALL_PROGRAM=@INSTALL_PROGRAM@
+INSTALL_SCRIPT=@INSTALL_SCRIPT@
+INSTALL_DATA=@INSTALL_DATA@
+MKSHLIB=@MKSHLIB@
+LN_S=@LN_S@
+
+# shared libraries
+LIBDIR=$(libdir)
+# programs
+BINDIR=$(bindir)
+# font configuration files
+CONFDIR=$(sysconfdir)/fonts
+
+LIBBASE=libfontconfig.so
+LIBFILE=$(LIBBASE).@PACKAGE_MAJOR@.@PACKAGE_MINOR@
+LIBMAJOR=$(LIBBASE).@PACKAGE_MAJOR@
+
+LIBFONTCONFIG=-L$(SRCDIR) -lfontconfig
+
+SRCDIR=$(TOPDIR)/src
diff --git a/config/config.guess b/config/config.guess
new file mode 100644 (file)
index 0000000..9b77b57
--- /dev/null
@@ -0,0 +1,1391 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+#   Free Software Foundation, Inc.
+
+timestamp='2001-02-13'
+
+# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# Please send patches to <config-patches@gnu.org>.
+#
+# 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, 93, 94, 95, 96, 97, 98, 99, 2000
+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" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script.
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int dummy(){}" > $dummy.c
+       for c in cc gcc c89 ; do
+         ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1
+         if test $? = 0 ; then
+            CC_FOR_BUILD="$c"; break
+         fi
+       done
+       rm -f $dummy.c $dummy.o $dummy.rel
+       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
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 8/24/94.)
+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.
+       # Determine the machine/vendor (is the vendor relevant).
+       case "${UNAME_MACHINE}" in
+           amiga) machine=m68k-unknown ;;
+           arm32) machine=arm-unknown ;;
+           atari*) machine=m68k-atari ;;
+           sun3*) machine=m68k-sun ;;
+           mac68k) machine=m68k-apple ;;
+           macppc) machine=powerpc-apple ;;
+           hp3[0-9][05]) machine=m68k-hp ;;
+           ibmrt|romp-ibm) machine=romp-ibm ;;
+           *) machine=${UNAME_MACHINE}-unknown ;;
+       esac
+       # The Operating System including object format, if it has switched
+       # to ELF recently, or will in the future.
+       case "${UNAME_MACHINE}" in
+           i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
+               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
+       release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       # 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 0 ;;
+    alpha:OSF1:*:*)
+       if test $UNAME_RELEASE = "V4.0"; then
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+       fi
+       # 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.
+       cat <<EOF >$dummy.s
+       .data
+\$Lformat:
+       .byte 37,100,45,37,120,10,0     # "%d-%x\n"
+
+       .text
+       .globl main
+       .align 4
+       .ent main
+main:
+       .frame \$30,16,\$26,0
+       ldgp \$29,0(\$27)
+       .prologue 1
+       .long 0x47e03d80 # implver \$0
+       lda \$2,-1
+       .long 0x47e20c21 # amask \$2,\$1
+       lda \$16,\$Lformat
+       mov \$0,\$17
+       not \$1,\$18
+       jsr \$26,printf
+       ldgp \$29,0(\$26)
+       mov 0,\$16
+       jsr \$26,exit
+       .end main
+EOF
+       $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+       if test "$?" = 0 ; then
+               case `./$dummy` in
+                       0-0)
+                               UNAME_MACHINE="alpha"
+                               ;;
+                       1-0)
+                               UNAME_MACHINE="alphaev5"
+                               ;;
+                       1-1)
+                               UNAME_MACHINE="alphaev56"
+                               ;;
+                       1-101)
+                               UNAME_MACHINE="alphapca56"
+                               ;;
+                       2-303)
+                               UNAME_MACHINE="alphaev6"
+                               ;;
+                       2-307)
+                               UNAME_MACHINE="alphaev67"
+                               ;;
+               esac
+       fi
+       rm -f $dummy.s $dummy
+       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+       exit 0 ;;
+    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 0 ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-unknown-sysv4
+       exit 0;;
+    amiga:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-amigaos
+       exit 0 ;;
+    arc64:OpenBSD:*:*)
+       echo mips64el-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    arc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    hkmips:OpenBSD:*:*)
+       echo mips-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    pmax:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sgi:OpenBSD:*:*)
+       echo mips-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    *:OS/390:*:*)
+       echo i370-ibm-openedition
+       exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit 0;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit 0;;
+    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 0 ;;
+    NILE*:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit 0 ;;
+    sun4H:SunOS:5.*:*)
+       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    i86pc:SunOS:5.*:*)
+       echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    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 0 ;;
+    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 0 ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    sun*:*:4.2BSD:*)
+       UNAME_RELEASE=`(head -1 /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 0 ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    atari*:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    # 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 0 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+       exit 0 ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit 0 ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit 0 ;;
+    sun3*:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mac68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+       echo m88k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten${UNAME_RELEASE}
+       exit 0 ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit 0 ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+       echo clipper-intergraph-clix${UNAME_RELEASE}
+       exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       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 $dummy.c -o $dummy \
+         && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+         && rm $dummy.c $dummy && exit 0
+       rm -f $dummy.c $dummy
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit 0 ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit 0 ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit 0 ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    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 0 ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit 0 ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit 0 ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+       exit 0 ;;
+    ????????: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 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i?86:AIX:*:*)
+       echo i386-ibm-aix
+       exit 0 ;;
+    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 0 ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               sed 's/^                //' << EOF >$dummy.c
+               #include <sys/systemcfg.h>
+
+               main()
+                       {
+                       if (!__power_pc())
+                               exit(1);
+                       puts("powerpc-ibm-aix3.2.5");
+                       exit(0);
+                       }
+EOF
+               $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+               rm -f $dummy.c $dummy
+               echo rs6000-ibm-aix3.2.5
+       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 0 ;;
+    *:AIX:*:[45])
+       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | 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 0 ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+       echo romp-ibm-bsd4.4
+       exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+       exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit 0 ;;
+    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])
+              case "${HPUX_REV}" in
+                11.[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" ;;
+                        esac ;;
+                    esac
+                  fi ;;
+              esac
+              if [ "${HP_ARCH}" = "" ]; then
+              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 $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+       if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
+       rm -f $dummy.c $dummy
+       fi ;;
+       esac
+       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+       exit 0 ;;
+    ia64:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       echo ia64-hp-hpux${HPUX_REV}
+       exit 0 ;;
+    3050*:HI-UX:*:*)
+       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 $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+       rm -f $dummy.c $dummy
+       echo unknown-hitachi-hiuxwe2
+       exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+       echo hppa1.1-hp-bsd
+       exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit 0 ;;
+    *9??*:MPE/iX:*:*)
+       echo hppa1.0-hp-mpeix
+       exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+       echo hppa1.1-hp-osf
+       exit 0 ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit 0 ;;
+    i?86:OSF1:*:*)
+       if [ -x /usr/sbin/sysversion ] ; then
+           echo ${UNAME_MACHINE}-unknown-osf1mk
+       else
+           echo ${UNAME_MACHINE}-unknown-osf1
+       fi
+       exit 0 ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit 0 ;;
+    hppa*:OpenBSD:*:*)
+       echo hppa-unknown-openbsd
+       exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+       echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos${UNAME_RELEASE}
+       exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+       exit 0 ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*T3D:*:*:*)
+       echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*T3E:*:*:*)
+       echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*SV1:*:*:*)
+       echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY-2:*:*:*)
+       echo cray2-cray-unicos
+        exit 0 ;;
+    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 0 ;;
+    hp300:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    i?86:BSD/386:*:* | i?86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    sparc*:BSD/OS:*:*)
+       echo sparc-unknown-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:FreeBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+       exit 0 ;;
+    *:OpenBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       exit 0 ;;
+    i*:CYGWIN*:*)
+       echo ${UNAME_MACHINE}-pc-cygwin
+       exit 0 ;;
+    i*:MINGW*:*)
+       echo ${UNAME_MACHINE}-pc-mingw32
+       exit 0 ;;
+    i*:PW*:*)
+       echo ${UNAME_MACHINE}-pc-pw32
+       exit 0 ;;
+    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 i386-pc-interix
+       exit 0 ;;
+    i*:UWIN*:*)
+       echo ${UNAME_MACHINE}-pc-uwin
+       exit 0 ;;
+    p*:CYGWIN*:*)
+       echo powerpcle-unknown-cygwin
+       exit 0 ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    *:GNU:*:*)
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       exit 0 ;;
+    i*86:Minix:*:*)
+       echo ${UNAME_MACHINE}-pc-minix
+       exit 0 ;;
+    ia64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux
+       exit 0 ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+       echo ${UNAME_MACHINE}-ibm-linux
+       exit 0 ;;
+    mips:Linux:*:*)
+       cat >$dummy.c <<EOF
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+int main (int argc, char *argv[]) {
+#else
+int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __MIPSEB__
+  printf ("%s-unknown-linux-gnu\n", argv[1]);
+#endif
+#ifdef __MIPSEL__
+  printf ("%sel-unknown-linux-gnu\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+       $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
+       rm -f $dummy.c $dummy
+       ;;
+    x86_64:Linux:*:*)
+       echo x86_64-unknown-linux-gnu
+       exit 0 ;;
+    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 0 ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+       echo hppa64-unknown-linux-gnu
+       exit 0 ;;
+    sh*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    *: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.
+       ld_supported_emulations=`cd /; ld --help 2>&1 \
+                        | sed -ne '/supported emulations:/!d
+                                   s/[         ][      ]*/ /g
+                                   s/.*supported emulations: *//
+                                   s/ .*//
+                                   p'`
+        case "$ld_supported_emulations" in
+         i?86linux)
+               echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+               exit 0
+               ;;
+         elf_i?86)
+               TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+               ;;
+         i?86coff)
+               echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+               exit 0
+               ;;
+         sparclinux)
+               echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+               exit 0
+               ;;
+         elf32_sparc)
+               echo "${UNAME_MACHINE}-unknown-linux-gnu"
+               exit 0
+               ;;
+         armlinux)
+               echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+               exit 0
+               ;;
+         elf32arm*)
+               echo "${UNAME_MACHINE}-unknown-linux-gnuoldld"
+               exit 0
+               ;;
+         armelf_linux*)
+               echo "${UNAME_MACHINE}-unknown-linux-gnu"
+               exit 0
+               ;;
+         m68klinux)
+               echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+               exit 0
+               ;;
+         elf32ppc | elf32ppclinux)
+               # Determine Lib Version
+               cat >$dummy.c <<EOF
+#include <features.h>
+#if defined(__GLIBC__)
+extern char __libc_version[];
+extern char __libc_release[];
+#endif
+main(argc, argv)
+     int argc;
+     char *argv[];
+{
+#if defined(__GLIBC__)
+  printf("%s %s\n", __libc_version, __libc_release);
+#else
+  printf("unkown\n");
+#endif
+  return 0;
+}
+EOF
+               LIBC=""
+               $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null
+               if test "$?" = 0 ; then
+                       ./$dummy | grep 1\.99 > /dev/null
+                       if test "$?" = 0 ; then
+                               LIBC="libc1"
+                       fi
+               fi
+               rm -f $dummy.c $dummy
+               echo powerpc-unknown-linux-gnu${LIBC}
+               exit 0
+               ;;
+       esac
+
+       if test "${UNAME_MACHINE}" = "alpha" ; then
+               cat <<EOF >$dummy.s
+                       .data
+               \$Lformat:
+                       .byte 37,100,45,37,120,10,0     # "%d-%x\n"
+
+                       .text
+                       .globl main
+                       .align 4
+                       .ent main
+               main:
+                       .frame \$30,16,\$26,0
+                       ldgp \$29,0(\$27)
+                       .prologue 1
+                       .long 0x47e03d80 # implver \$0
+                       lda \$2,-1
+                       .long 0x47e20c21 # amask \$2,\$1
+                       lda \$16,\$Lformat
+                       mov \$0,\$17
+                       not \$1,\$18
+                       jsr \$26,printf
+                       ldgp \$29,0(\$26)
+                       mov 0,\$16
+                       jsr \$26,exit
+                       .end main
+EOF
+               LIBC=""
+               $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+               if test "$?" = 0 ; then
+                       case `./$dummy` in
+                       0-0)    UNAME_MACHINE="alpha" ;;
+                       1-0)    UNAME_MACHINE="alphaev5" ;;
+                       1-1)    UNAME_MACHINE="alphaev56" ;;
+                       1-101)  UNAME_MACHINE="alphapca56" ;;
+                       2-303)  UNAME_MACHINE="alphaev6" ;;
+                       2-307)  UNAME_MACHINE="alphaev67" ;;
+                       esac
+
+                       objdump --private-headers $dummy | \
+                         grep ld.so.1 > /dev/null
+                       if test "$?" = 0 ; then
+                               LIBC="libc1"
+                       fi
+               fi
+               rm -f $dummy.s $dummy
+               echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
+       else
+         # Either a pre-BFD a.out linker (linux-gnuoldld)
+         # or one that does not give us useful --help.
+         # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
+         # If ld does not provide *any* "supported emulations:"
+         # that means it is gnuoldld.
+         test -z "$ld_supported_emulations" \
+           && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+
+         case "${UNAME_MACHINE}" in
+         i?86)
+           VENDOR=pc;
+           ;;
+         *)
+           VENDOR=unknown;
+           ;;
+         esac
+         # Determine whether the default compiler is a.out or elf
+         cat >$dummy.c <<EOF
+#include <features.h>
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __ELF__
+# ifdef __GLIBC__
+#  if __GLIBC__ >= 2
+    printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
+#  else
+    printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+#  endif
+# else
+   printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+  printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+         $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
+         rm -f $dummy.c $dummy
+         test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+       fi ;;
+# 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.
+    i?86:DYNIX/ptx:4*:*)
+       echo i386-sequent-sysv4
+       exit 0 ;;
+    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 0 ;;
+    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 0 ;;
+    i?86:*:5:7*)
+        # Fixed at (any) Pentium or better
+        UNAME_MACHINE=i586
+        if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then
+           echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION}
+       else
+           echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+       fi
+       exit 0 ;;
+    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|egrep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+       else
+               echo ${UNAME_MACHINE}-pc-sysv32
+       fi
+       exit 0 ;;
+    i?86:*DOS:*:*)
+       echo ${UNAME_MACHINE}-pc-msdosdjgpp
+       exit 0 ;;
+    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 0 ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit 0 ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit 0 ;;
+    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 0 ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit 0 ;;
+    M68*:*:R3V[567]*:*)
+       test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*: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 0
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:*)
+       echo m68k-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit 0 ;;
+    i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*)
+       echo i386-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    rs6000:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:*)
+       echo powerpc-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv${UNAME_RELEASE}
+       exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    *: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 0 ;;
+    PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                           # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit 0 ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit 0 ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux${UNAME_RELEASE}
+       exit 0 ;;
+    news*:NEWS-OS:6*:*)
+       echo mips-sony-newsos6
+       exit 0 ;;
+    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 0 ;;
+    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
+       echo powerpc-be-beos
+       exit 0 ;;
+    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
+       echo powerpc-apple-beos
+       exit 0 ;;
+    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
+       echo i586-pc-beos
+       exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+       echo sx4-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+       echo sx5-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    Power*:Rhapsody:*:*)
+       echo powerpc-apple-rhapsody${UNAME_RELEASE}
+       exit 0 ;;
+    *:Rhapsody:*:*)
+       echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+       exit 0 ;;
+    *:Darwin:*:*)
+       echo `uname -p`-apple-darwin${UNAME_RELEASE}
+       exit 0 ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+       if test "${UNAME_MACHINE}" = "x86pc"; then
+               UNAME_MACHINE=pc
+       fi
+       echo `uname -p`-${UNAME_MACHINE}-nto-qnx
+       exit 0 ;;
+    *:QNX:*:4*)
+       echo i386-pc-qnx
+       exit 0 ;;
+    NSR-[KW]:NONSTOP_KERNEL:*:*)
+       echo nsr-tandem-nsk${UNAME_RELEASE}
+       exit 0 ;;
+    *:NonStop-UX:*:*)
+       echo mips-compaq-nonstopux
+       exit 0 ;;
+    BS2000:POSIX*:*:*)
+       echo bs2000-siemens-sysv
+       exit 0 ;;
+    DS/*:UNIX_System_V:*:*)
+       echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+       exit 0 ;;
+    *: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 0 ;;
+    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 0 ;;
+    *:TOPS-10:*:*)
+       echo pdp10-unknown-tops10
+       exit 0 ;;
+    *:TENEX:*:*)
+       echo pdp10-unknown-tenex
+       exit 0 ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+       echo pdp10-dec-tops20
+       exit 0 ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+       echo pdp10-xkl-tops20
+       exit 0 ;;
+    *:TOPS-20:*:*)
+       echo pdp10-unknown-tops20
+       exit 0 ;;
+    *:ITS:*:*)
+       echo pdp10-unknown-its
+       exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+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"); 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 $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0
+rm -f $dummy.c $dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# 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 0 ;;
+    c2*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit 0 ;;
+    c34*)
+       echo c34-convex-bsd
+       exit 0 ;;
+    c38*)
+       echo c38-convex-bsd
+       exit 0 ;;
+    c4*)
+       echo c4-convex-bsd
+       exit 0 ;;
+    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
+
+    ftp://ftp.gnu.org/pub/gnu/config/
+
+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/config/config.sub b/config/config.sub
new file mode 100644 (file)
index 0000000..b7d9794
--- /dev/null
@@ -0,0 +1,1355 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+#   Free Software Foundation, Inc.
+
+timestamp='2001-02-13'
+
+# 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., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, 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>.
+#
+# 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
+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
+  nto-qnx* | linux-gnu* | storm-chaos* | os2-emx*)
+    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)
+               os=
+               basic_machine=$1
+               ;;
+       -sim | -cisco | -oki | -wec | -winbond)
+               os=
+               basic_machine=$1
+               ;;
+       -scout)
+               ;;
+       -wrs)
+               os=-vxworks
+               basic_machine=$1
+               ;;
+       -hiux*)
+               os=-hiuxwe2
+               ;;
+       -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/'`
+               ;;
+       -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.
+       tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc \
+               | arm | arme[lb] | arm[bl]e | armv[2345] | armv[345][lb] | strongarm | xscale \
+               | pyramid | mn10200 | mn10300 | tron | a29k \
+               | 580 | i960 | h8300 \
+               | x86 | ppcbe | mipsbe | mipsle | shbe | shle \
+               | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
+               | hppa64 \
+               | alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \
+               | alphaev6[78] \
+               | we32k | ns16k | clipper | i370 | sh | sh[34] \
+               | powerpc | powerpcle \
+               | 1750a | dsp16xx | pdp10 | 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 | d30v | fr30 | avr | openrisc)
+               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)
+               ;;
+
+       # 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[234567]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.
+       # FIXME: clean up the formatting here.
+       vax-* | tahoe-* | i[234567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \
+             | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | c[123]* \
+             | arm-*  | armbe-* | armle-* | armv*-* | strongarm-* | xscale-* \
+             | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
+             | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \
+             | xmp-* | ymp-* \
+             | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* \
+             | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \
+             | hppa2.0n-* | hppa64-* \
+             | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \
+             | alphaev6[78]-* \
+             | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \
+             | clipper-* | orion-* \
+             | sparclite-* | pdp10-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
+             | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \
+             | mips64el-* | mips64orion-* | mips64orionel-* \
+             | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \
+             | mipstx39-* | mipstx39el-* | mcore-* \
+             | f30[01]-* | f700-* | s390-* | s390x-* | sv1-* | t3e-* \
+             | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \
+             | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* \
+             | bs2000-* | tic54x-* | c54x-* | x86_64-*)
+               ;;
+       # 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
+               ;;
+       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
+               ;;
+       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
+               ;;
+       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 | ymp)
+               basic_machine=ymp-cray
+               os=-unicos
+               ;;
+       cray2)
+               basic_machine=cray2-cray
+               os=-unicos
+               ;;
+       [cjt]90)
+               basic_machine=${basic_machine}-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
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               basic_machine=m68k-motorola
+               ;;
+       delta88)
+               basic_machine=m88k-motorola
+               os=-sysv3
+               ;;
+       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[34567]86v32)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv32
+               ;;
+       i[34567]86v4*)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv4
+               ;;
+       i[34567]86v)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv
+               ;;
+       i[34567]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
+               ;;
+       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
+               ;;
+       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
+               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
+               ;;
+       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
+               ;;
+       pentium | p5 | k5 | k6 | nexgen)
+               basic_machine=i586-pc
+               ;;
+       pentiumpro | p6 | 6x86 | athlon)
+               basic_machine=i686-pc
+               ;;
+       pentiumii | pentium2)
+               basic_machine=i686-pc
+               ;;
+       pentium-* | p5-* | k5-* | k6-* | nexgen-*)
+               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumpro-* | p6-* | 6x86-* | athlon-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumii-* | pentium2-*)
+               basic_machine=i686-`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/^[^-]*-//'`
+               ;;
+       ps2)
+               basic_machine=i386-ibm
+               ;;
+       pw32)
+               basic_machine=i586-unknown
+               os=-pw32
+               ;;
+       rom68k)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       rm[46]00)
+               basic_machine=mips-siemens
+               ;;
+       rtpc | rtpc-*)
+               basic_machine=romp-ibm
+               ;;
+       sa29200)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       sequent)
+               basic_machine=i386-sequent
+               ;;
+       sh)
+               basic_machine=sh-hitachi
+               os=-hms
+               ;;
+       sparclite-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=t3e-cray
+               os=-unicos
+               ;;
+       tic54x | c54x*)
+               basic_machine=tic54x-unknown
+               os=-coff
+               ;;
+       tx39)
+               basic_machine=mipstx39-unknown
+               ;;
+       tx39el)
+               basic_machine=mipstx39el-unknown
+               ;;
+       tower | tower-32)
+               basic_machine=m68k-ncr
+               ;;
+       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
+               ;;
+       xmp)
+               basic_machine=xmp-cray
+               os=-unicos
+               ;;
+        xps | xps100)
+               basic_machine=xps100-honeywell
+               ;;
+       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
+               ;;
+       mips)
+               if [ x$os = x-linux-gnu ]; then
+                       basic_machine=mips-unknown
+               else
+                       basic_machine=mips-mips
+               fi
+               ;;
+       romp)
+               basic_machine=romp-ibm
+               ;;
+       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
+               ;;
+       sh3 | sh4)
+               basic_machine=sh-unknown
+               ;;
+       sparc | sparcv9)
+               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
+               ;;
+       c4x*)
+               basic_machine=c4x-none
+               os=-coff
+               ;;
+       *)
+               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* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+             | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+             | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
+             | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+             | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* | -os2*)
+       # Remember, each alternative MUST END IN *, to match a version number.
+               ;;
+       -qnx*)
+               case $basic_machine in
+                   x86-* | i[34567]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* | -mmixware* | -mon960* | -lnews*)
+               ;;
+       -mac*)
+               os=`echo $os | sed -e 's|mac|macos|'`
+               ;;
+       -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
+               ;;
+       -wince*)
+               os=-wince
+               ;;
+       -osfrose*)
+               os=-osfrose
+               ;;
+       -osf*)
+               os=-osf
+               ;;
+       -utek*)
+               os=-bsd
+               ;;
+       -dynix*)
+               os=-bsd
+               ;;
+       -acis*)
+               os=-aos
+               ;;
+       -386bsd)
+               os=-bsd
+               ;;
+       -ctix* | -uts*)
+               os=-sysv
+               ;;
+       -ns2 )
+               os=-nextstep2
+               ;;
+       -nsk*)
+               os=-nsk
+               ;;
+       # Preserve the version number of sinix5.
+       -sinix5.*)
+               os=`echo $os | sed -e 's|sinix|sysv|'`
+               ;;
+       -sinix*)
+               os=-sysv4
+               ;;
+       -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
+               ;;
+       -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
+       *-acorn)
+               os=-riscix1.2
+               ;;
+       arm*-rebel)
+               os=-linux
+               ;;
+       arm*-semi)
+               os=-aout
+               ;;
+       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
+               ;;
+       mips*-cisco)
+               os=-elf
+               ;;
+       mips*-*)
+               os=-elf
+               ;;
+       *-tti)  # must be before sparc entry or we get the wrong os.
+               os=-sysv3
+               ;;
+       sparc-* | *-sun)
+               os=-sunos4.1.1
+               ;;
+       *-be)
+               os=-beos
+               ;;
+       *-ibm)
+               os=-aix
+               ;;
+       *-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
+                               ;;
+                       -ptx*)
+                               vendor=sequent
+                               ;;
+                       -vxsim* | -vxworks*)
+                               vendor=wrs
+                               ;;
+                       -aux*)
+                               vendor=apple
+                               ;;
+                       -hms*)
+                               vendor=hitachi
+                               ;;
+                       -mpw* | -macos*)
+                               vendor=apple
+                               ;;
+                       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+                               vendor=atari
+                               ;;
+               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/config/install.sh b/config/install.sh
new file mode 100644 (file)
index 0000000..211cc9e
--- /dev/null
@@ -0,0 +1,240 @@
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+#
+# $XFree86$
+#
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+tranformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+       -c) instcmd="$cpprog"
+           shift
+           continue;;
+
+       -d) dir_arg=true
+           shift
+           continue;;
+
+       -m) chmodcmd="$chmodprog $2"
+           shift
+           shift
+           continue;;
+
+       -o) chowncmd="$chownprog $2"
+           shift
+           shift
+           continue;;
+
+       -g) chgrpcmd="$chgrpprog $2"
+           shift
+           shift
+           continue;;
+
+       -s) stripcmd="$stripprog"
+           shift
+           continue;;
+
+       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+           shift
+           continue;;
+
+       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+           shift
+           continue;;
+
+       *)  if [ x"$src" = x ]
+           then
+               src=$1
+           else
+               # this colon is to work around a 386BSD /bin/sh bug
+               :
+               dst=$1
+           fi
+           shift
+           continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+       echo "install:  no input file specified"
+       exit 1
+else
+       true
+fi
+
+if [ x"$dir_arg" != x ]; then
+       dst=$src
+       src=""
+
+       if [ -d $dst ]; then
+               instcmd=:
+       else
+               instcmd=mkdir
+       fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+       if [ -f $src -o -d $src ]
+       then
+               true
+       else
+               echo "install:  $src does not exist"
+               exit 1
+       fi
+
+       if [ x"$dst" = x ]
+       then
+               echo "install:  no destination specified"
+               exit 1
+       else
+               true
+       fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+       if [ -d $dst ]
+       then
+               dst="$dst"/`basename $src`
+       else
+               true
+       fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='   
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+       pathcomp="${pathcomp}${1}"
+       shift
+
+       if [ ! -d "${pathcomp}" ] ;
+        then
+               $mkdirprog "${pathcomp}"
+       else
+               true
+       fi
+
+       pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+       $doit $instcmd $dst &&
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+       if [ x"$transformarg" = x ]
+       then
+               dstfile=`basename $dst`
+       else
+               dstfile=`basename $dst $transformbasename |
+                       sed $transformarg`$transformbasename
+       fi
+
+# don't allow the sed command to completely eliminate the filename
+
+       if [ x"$dstfile" = x ]
+       then
+               dstfile=`basename $dst`
+       else
+               true
+       fi
+
+# Make a temp file name in the proper directory.
+
+       dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+       $doit $instcmd $src $dsttmp &&
+
+       trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+       $doit $rmcmd -f $dstdir/$dstfile &&
+       $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
index afd160193ab26bd0d3bbb7b6cb582e0a0f612726..0e3cbfce4e81faedd7204d605f88d73cb0b1ba74 100644 (file)
@@ -1,3 +1,8 @@
+#ifdef UseInstalled
+/* building outside the tree, use private defines */
+#include "../local.def"
+#endif
+
 INCLUDES=$(FREETYPE2INCLUDES) $(LIBXML2INCLUDES) -I..
 
 LOCAL_LIBRARIES=FontconfigClientLibs
@@ -11,5 +16,5 @@ LinkBuildBinary(ProgramTargetName(fc-cache))
 
 install::
        if [ x$${DESTDIR} = x ]; then \
-               FC_DEBUG=128 $(FCCACHE) -v ;\
+               $(FCCACHE) -v -f;\
        fi
diff --git a/fc-cache/Makefile.in b/fc-cache/Makefile.in
new file mode 100644 (file)
index 0000000..7cde602
--- /dev/null
@@ -0,0 +1,46 @@
+#
+# $XFree86$
+#
+# Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of Keith Packard not be used in
+# advertising or publicity pertaining to distribution of the software without
+# specific, written prior permission.  Keith Packard makes no
+# representations about the suitability of this software for any purpose.  It
+# is provided "as is" without express or implied warranty.
+#
+# KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+# EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, 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.
+#
+
+TOPDIR=..
+
+include $(TOPDIR)/config/Makedefs
+
+SRCS=fc-cache.c
+
+OBJS=fc-cache.o
+
+PROG=fc-cache
+
+all:: $(PROG)
+
+install:: $(BINDIR)/$(PROG)
+
+$(BINDIR)/$(PROG): $(PROG)
+       $(INSTALL_PROGRAM) $(PROG) $(BINDIR)
+
+clean::
+       rm -f $(PROG) $(OBJS)
+
+$(PROG): $(OBJS)
+       $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBFONTCONFIG)
index 881278e876b0fb7bb4d89b0a3e9574c733ab98f2..b3d0f3f80ba6e1175b3eefa92ed400013a1fbfdf 100644 (file)
@@ -46,6 +46,7 @@
 #define _GNU_SOURCE
 #include <getopt.h>
 const struct option longopts[] = {
+    {"force", 0, 0, 'f'},
     {"version", 0, 0, 'V'},
     {"verbose", 0, 0, 'v'},
     {"help", 0, 0, '?'},
@@ -61,41 +62,134 @@ extern int optind, opterr, optopt;
 static void
 usage (char *program)
 {
-    fprintf (stderr, "usage: %s [-vV?] [--verbose] [--version] [--help] [dirs]\n",
+    fprintf (stderr, "usage: %s [-fvV?] [--force] [--verbose] [--version] [--help] [dirs]\n",
             program);
     fprintf (stderr, "Build font information caches in [dirs]\n"
             "(all directories in font configuration by default).\n");
     fprintf (stderr, "\n");
+    fprintf (stderr, "  -v, --force          scan directories with apparently valid caches\n");
     fprintf (stderr, "  -v, --verbose        display status information while busy\n");
     fprintf (stderr, "  -V, --version        display font config version and exit\n");
     fprintf (stderr, "  -?, --help           display this help and exit\n");
     exit (1);
 }
 
-int
-main (int argc, char **argv)
+static int
+nsubdirs (FcStrSet *set)
+{
+    FcStrList  *list;
+    int                n = 0;
+
+    list = FcStrListCreate (set);
+    if (!list)
+       return 0;
+    while (FcStrListNext (list))
+       n++;
+    FcStrListDone (list);
+    return n;
+}
+
+static int
+scanDirs (FcStrList *list, char *program, FcBool force, FcBool verbose)
 {
     int                ret = 0;
+    FcChar8    *dir;
     FcFontSet  *set;
-    FcChar8    **dirs;
-    int                verbose = 0;
+    FcStrSet   *subdirs;
+    FcStrList  *sublist;
+    
+    /*
+     * Now scan all of the directories into separate databases
+     * and write out the results
+     */
+    while ((dir = FcStrListNext (list)))
+    {
+       if (verbose)
+       {
+           printf ("%s: \"%s\": ", program, dir);
+           fflush (stdout);
+       }
+       set = FcFontSetCreate ();
+       if (!set)
+       {
+           fprintf (stderr, "Can't create font set\n");
+           ret++;
+           continue;
+       }
+       subdirs = FcStrSetCreate ();
+       if (!subdirs)
+       {
+           fprintf (stderr, "Can't create directory set\n");
+           ret++;
+           continue;
+       }
+       if (!FcDirScan (set, subdirs, 0, FcConfigGetBlanks (0), dir, force))
+       {
+           fprintf (stderr, "Can't scan \"%s\"\n", dir);
+           ret++;
+           continue;
+       }
+       if (!force && FcDirCacheValid (dir))
+       {
+           if (verbose)
+               printf ("skipping, %d fonts, %d dirs\n",
+                       set->nfont, nsubdirs(subdirs));
+       }
+       else
+       {
+           if (verbose)
+               printf ("caching, %d fonts, %d dirs\n", 
+                       set->nfont, nsubdirs (subdirs));
+           if (!FcDirSave (set, subdirs, dir))
+           {
+               fprintf (stderr, "Can't save cache in \"%s\"\n", dir);
+               ret++;
+           }
+       }
+       FcFontSetDestroy (set);
+       sublist = FcStrListCreate (subdirs);
+       if (!sublist)
+       {
+           fprintf (stderr, "Can't create subdir list in \"%s\"\n", dir);
+           ret++;
+           continue;
+       }
+       ret += scanDirs (sublist, program, force, verbose);
+       FcStrSetDestroy (subdirs);
+    }
+    FcStrListDone (list);
+    return ret;
+}
+
+int
+main (int argc, char **argv)
+{
+    FcStrSet   *dirs;
+    FcStrList  *list;
+    FcBool     verbose = FcFalse;
+    FcBool     force = FcFalse;
+    FcConfig   *config;
     int                i;
+    int                ret;
 #if HAVE_GETOPT_LONG || HAVE_GETOPT
     int                c;
 
 #if HAVE_GETOPT_LONG
-    while ((c = getopt_long (argc, argv, "Vv?", longopts, NULL)) != -1)
+    while ((c = getopt_long (argc, argv, "fVv?", longopts, NULL)) != -1)
 #else
-    while ((c = getopt (argc, argv, "Vv?")) != -1)
+    while ((c = getopt (argc, argv, "fVv?")) != -1)
 #endif
     {
        switch (c) {
+       case 'f':
+           force = FcTrue;
+           break;
        case 'V':
            fprintf (stderr, "fontconfig version %d.%d.%d\n", 
                     FC_MAJOR, FC_MINOR, FC_REVISION);
            exit (0);
        case 'v':
-           verbose = 1;
+           verbose = FcTrue;
            break;
        default:
            usage (argv[0]);
@@ -106,51 +200,36 @@ main (int argc, char **argv)
     i = 1;
 #endif
 
-    if (!FcInitConfig ())
+    config = FcInitLoadConfig ();
+    if (!config)
     {
-       fprintf (stderr, "Can't init font config library\n");
+       fprintf (stderr, "%s: Can't init font config library\n", argv[0]);
        return 1;
     }
     if (argv[i])
-       dirs = (FcChar8 **) (argv+i);
-    else
-       dirs = FcConfigGetDirs (0);
-    /*
-     * Now scan all of the directories into separate databases
-     * and write out the results
-     */
-    while (dirs && *dirs)
     {
-       if (verbose)
-           printf ("%s: Scanning directory \"%s\"\n", argv[0], *dirs);
-       set = FcFontSetCreate ();
-       if (!set)
+       dirs = FcStrSetCreate ();
+       if (!dirs)
        {
-           fprintf (stderr, "Out of memory in \"%s\"\n", *dirs);
-           ret++;
+           fprintf (stderr, "%s: Can't create list of directories\n",
+                    argv[0]);
+           return 1;
        }
-       else
+       while (argv[i])
        {
-           if (!FcDirScan (set, 0, FcConfigGetBlanks (0), *dirs, FcTrue))
+           if (!FcStrSetAdd (dirs, (FcChar8 *) argv[i]))
            {
-               fprintf (stderr, "Can't scan directory \"%s\"\n", *dirs);
-               ret++;
+               fprintf (stderr, "%s: Can't add directory\n", argv[0]);
+               return 1;
            }
-           else
-           {
-               if (verbose)
-                   printf ("%s: Saving %d font names for \"%s\"\n", 
-                           argv[0], set->nfont, *dirs);
-               if (!FcDirSave (set, *dirs))
-               {
-                   fprintf (stderr, "Can't save cache in \"%s\"\n", *dirs);
-                   ret++;
-               }
-           }
-           FcFontSetDestroy (set);
+           i++;
        }
-       ++dirs;
+       list = FcStrListCreate (dirs);
+       FcStrSetDestroy (dirs);
     }
+    else
+       list = FcConfigGetConfigDirs (config);
+    ret = scanDirs (list, argv[0], force, verbose);
     if (verbose)
        printf ("%s: %s\n", argv[0], ret ? "failed" : "succeeded");
     return ret;
diff --git a/fc-list/Makefile.in b/fc-list/Makefile.in
new file mode 100644 (file)
index 0000000..7d92286
--- /dev/null
@@ -0,0 +1,46 @@
+#
+# $XFree86$
+#
+# Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of Keith Packard not be used in
+# advertising or publicity pertaining to distribution of the software without
+# specific, written prior permission.  Keith Packard makes no
+# representations about the suitability of this software for any purpose.  It
+# is provided "as is" without express or implied warranty.
+#
+# KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+# EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, 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.
+#
+
+TOPDIR=..
+
+include $(TOPDIR)/config/Makedefs
+
+SRCS=fc-list.c
+
+OBJS=fc-list.o
+
+PROG=fc-list
+
+all:: $(PROG)
+
+install:: $(BINDIR)/$(PROG)
+
+$(BINDIR)/$(PROG): $(PROG)
+       $(INSTALL_PROGRAM) $(PROG) $(BINDIR)
+
+clean::
+       rm -f $(PROG) $(OBJS)
+
+$(PROG): $(OBJS)
+       $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBFONTCONFIG)
index 1085ed657a88e5b695cd93e4f75866ed97c2ad72..3549f01cf7c1a394cd13c15c16ba8ddc6921e146 100644 (file)
@@ -228,6 +228,10 @@ typedef struct _FcFileCache FcFileCache;
 
 typedef struct _FcBlanks    FcBlanks;
 
+typedef struct _FcStrList   FcStrList;
+
+typedef struct _FcStrSet    FcStrSet;
+
 _FCFUNCPROTOBEGIN
 
 /* fcblanks.c */
@@ -259,13 +263,19 @@ FcConfigSetCurrent (FcConfig *config);
 FcConfig *
 FcConfigGetCurrent (void);
 
+FcBool
+FcConfigUptoDate (FcConfig *config);
+    
 FcBool
 FcConfigBuildFonts (FcConfig *config);
 
-FcChar8 **
-FcConfigGetDirs (FcConfig   *config);
+FcStrList *
+FcConfigGetFontDirs (FcConfig   *config);
+
+FcStrList *
+FcConfigGetConfigDirs (FcConfig   *config);
 
-FcChar8 **
+FcStrList *
 FcConfigGetConfigFiles (FcConfig    *config);
 
 FcChar8 *
@@ -274,6 +284,12 @@ FcConfigGetCache (FcConfig  *config);
 FcBlanks *
 FcConfigGetBlanks (FcConfig *config);
 
+int
+FcConfigGetRescanInverval (FcConfig *config);
+
+FcBool
+FcConfigSetRescanInverval (FcConfig *config, int rescanInterval);
+
 FcFontSet *
 FcConfigGetFonts (FcConfig     *config,
                  FcSetName     set);
@@ -351,6 +367,7 @@ FcDefaultSubstitute (FcPattern *pattern);
 /* fcdir.c */
 FcBool
 FcFileScan (FcFontSet      *set,
+           FcStrSet        *dirs,
            FcFileCache     *cache,
            FcBlanks        *blanks,
            const FcChar8   *file,
@@ -358,13 +375,17 @@ FcFileScan (FcFontSet         *set,
 
 FcBool
 FcDirScan (FcFontSet       *set,
+          FcStrSet         *dirs,
           FcFileCache      *cache,
           FcBlanks         *blanks,
           const FcChar8    *dir,
           FcBool           force);
 
 FcBool
-FcDirSave (FcFontSet *set, const FcChar8 *dir);
+FcDirSave (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir);
+
+FcBool
+FcDirCacheValid (const FcChar8 *dir);
 
 /* fcfreetype.c */
 FcPattern *
@@ -382,14 +403,20 @@ FcBool
 FcFontSetAdd (FcFontSet *s, FcPattern *font);
 
 /* fcinit.c */
+FcConfig *
+FcInitLoadConfig (void);
+
+FcConfig *
+FcInitLoadConfigAndFonts (void);
+
 FcBool
-FcInitFonts (void);
+FcInit (void);
 
 FcBool
-FcInitConfig (void);
+FcInitReinitialize (void);
 
 FcBool
-FcInit (void);
+FcInitBringUptoDate (void);
 
 /* fclist.c */
 FcObjectSet *
@@ -592,11 +619,17 @@ FcPatternBuild (FcPattern *orig, ...);
 FcChar8 *
 FcStrCopy (const FcChar8 *s);
 
+FcChar8 *
+FcStrCopyFilename (const FcChar8 *s);
+    
 #define FcToLower(c)   (('A' <= (c) && (c) <= 'Z') ? (c) - 'A' + 'a' : (c))
 
 int
 FcStrCmpIgnoreCase (const FcChar8 *s1, const FcChar8 *s2);
 
+int
+FcStrCmp (const FcChar8 *s1, const FcChar8 *s2);
+
 int
 FcUtf8ToUcs4 (FcChar8   *src_orig,
              FcChar32  *dst,
@@ -608,6 +641,39 @@ FcUtf8Len (FcChar8 *string,
           int          *nchar,
           int          *wchar);
 
+FcChar8 *
+FcStrDirname (const FcChar8 *file);
+
+FcChar8 *
+FcStrBasename (const FcChar8 *file);
+
+FcStrSet *
+FcStrSetCreate (void);
+
+FcBool
+FcStrSetMember (FcStrSet *set, const FcChar8 *s);
+
+FcBool
+FcStrSetAdd (FcStrSet *set, const FcChar8 *s);
+
+FcBool
+FcStrSetAddFilename (FcStrSet *set, const FcChar8 *s);
+
+FcBool
+FcStrSetDel (FcStrSet *set, const FcChar8 *s);
+
+void
+FcStrSetDestroy (FcStrSet *set);
+
+FcStrList *
+FcStrListCreate (FcStrSet *set);
+
+FcChar8 *
+FcStrListNext (FcStrList *list);
+
+void
+FcStrListDone (FcStrList *list);
+
 /* fcxml.c */
 FcBool
 FcConfigParseAndLoad (FcConfig *config, const FcChar8 *file, FcBool complain);
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644 (file)
index 0000000..9e557e7
--- /dev/null
@@ -0,0 +1,105 @@
+#
+# $XFree86$
+#
+# Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of Keith Packard not be used in
+# advertising or publicity pertaining to distribution of the software without
+# specific, written prior permission.  Keith Packard makes no
+# representations about the suitability of this software for any purpose.  It
+# is provided "as is" without express or implied warranty.
+#
+# KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+# EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, 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.
+#
+
+TOPDIR=..
+
+include $(TOPDIR)/config/Makedefs
+
+LIBS=@LIBS@
+
+SRCS=fcatomic.c \
+     fcavl.c \
+     fcblanks.c \
+     fccache.c \
+     fccfg.c \
+     fccharset.c \
+     fcdbg.c \
+     fcdefault.c \
+     fcdir.c \
+     fcfreetype.c \
+     fcfs.c \
+     fcinit.c \
+     fclist.c \
+     fclock.c \
+     fcmatch.c \
+     fcmatrix.c \
+     fcname.c \
+     fcpat.c \
+     fcstr.c \
+     fcxml.c
+
+OBJS=fcatomic.@OBJEXT@ \
+     fcavl.@OBJEXT@ \
+     fcblanks.@OBJEXT@ \
+     fccache.@OBJEXT@ \
+     fccfg.@OBJEXT@ \
+     fccharset.@OBJEXT@ \
+     fcdbg.@OBJEXT@ \
+     fcdefault.@OBJEXT@ \
+     fcdir.@OBJEXT@ \
+     fcfreetype.@OBJEXT@ \
+     fcfs.@OBJEXT@ \
+     fcinit.@OBJEXT@ \
+     fclist.@OBJEXT@ \
+     fclock.@OBJEXT@ \
+     fcmatch.@OBJEXT@ \
+     fcmatrix.@OBJEXT@ \
+     fcname.@OBJEXT@ \
+     fcpat.@OBJEXT@ \
+     fcstr.@OBJEXT@ \
+     fcxml.@OBJEXT@
+
+.c.@OBJEXT@:
+       $(CC) $(CFLAGS) $(DSO_PIC_CFLAGS) -c $< -o $@
+       
+all:: $(LIBFILE) $(LIBMAJOR) $(LIBBASE)
+
+install:: $(LIBDIR)/$(LIB) $(LIBDIR)/$(LIBMAJOR) $(LIBDIR)/$(LIBBASE)
+
+$(LIBDIR)/$(LIBFILE): $(LIBFILE)
+       $(INSTALL_PROGRAM) $< $(LIBDIR)
+
+$(LIBDIR)/$(LIBMAJOR): $(LIBDIR)/$(LIBFILE)
+       $(LN_S) $(LIBDIR)/$(LIBFILE) $(LIBDIR)/$(LIBMAJOR)
+
+$(LIBDIR)/$(LIBBASE): $(LIBDIR)/$(LIBMAJOR)
+       $(LN_S) $(LIBDIR)/$(LIBMAJOR) $(LIBDIR)/$(LIBBASE)
+
+clean::
+       rm -f $(LIBFILE) $(LIBMAJOR) $(LIBBASE) $(OBJS)
+
+$(LIBFILE): $(OBJS)
+       rm -f $@
+       $(MKSHLIB) $(OBJS) $(LIBS)
+
+$(LIBMAJOR): $(LIBFILE)
+       rm -f  $@
+       $(LN_S) $(LIBFILE) $(LIBMAJOR)
+
+$(LIBBASE): $(LIBMAJOR)
+       rm -f $@
+       $(LN_S) $(LIBMAJOR) $(LIBBASE)
+
+$(OBJS): fcint.h $(TOPDIR)/fontconfig/fontconfig.h 
+$(OBJS): $(TOPDIR)/fontconfig/fcprivate.h $(TOPDIR)/config.h
index 2ee4b1ae7bdc89f2504370e42476b72be9a287b9..ec831043c45d07e1cd5f2699cde6b9d6417c0606 100644 (file)
@@ -487,15 +487,42 @@ bail0:
 }
 
 FcBool
-FcFileCacheReadDir (FcFontSet *set, const FcChar8 *cache_file)
+FcFileCacheValid (const FcChar8 *cache_file)
+{
+    FcChar8    *dir = FcStrDirname (cache_file);
+    struct stat        file_stat, dir_stat;
+
+    if (!dir)
+       return FcFalse;
+    if (stat ((char *) dir, &dir_stat) < 0)
+    {
+       FcStrFree (dir);
+       return FcFalse;
+    }
+    FcStrFree (dir);
+    if (stat ((char *) cache_file, &file_stat) < 0)
+       return FcFalse;
+    /*
+     * If the directory has been modified more recently than
+     * the cache file, the cache is not valid
+     */
+    if (dir_stat.st_mtime - file_stat.st_mtime > 0)
+       return FcFalse;
+    return FcTrue;
+}
+
+FcBool
+FcFileCacheReadDir (FcFontSet *set, FcStrSet *dirs, const FcChar8 *cache_file)
 {
     FcPattern      *font;
     FILE           *f;
-    FcChar8        *path;
     FcChar8        *base;
-    FcChar8        file_buf[8192], *file;
     int                    id;
+    int                    dir_len;
+    int                    file_len;
+    FcChar8        file_buf[8192], *file;
     FcChar8        name_buf[8192], *name;
+    FcChar8        path_buf[8192], *path;
     FcBool         ret = FcFalse;
 
     if (FcDebug () & FC_DBG_CACHE)
@@ -513,39 +540,72 @@ FcFileCacheReadDir (FcFontSet *set, const FcChar8 *cache_file)
        goto bail0;
     }
 
+    if (!FcFileCacheValid (cache_file))
+    {
+       if (FcDebug () & FC_DBG_CACHE)
+       {
+           printf (" cache file older than directory\n");
+       }
+       goto bail1;
+    }
+    
     base = (FcChar8 *) strrchr ((char *) cache_file, '/');
     if (!base)
        goto bail1;
     base++;
-    path = malloc (base - cache_file + 8192 + 1);
-    if (!path)
-       goto bail1;
-    memcpy (path, cache_file, base - cache_file);
-    base = path + (base - cache_file);
+    dir_len = base - cache_file;
+    if (dir_len < sizeof (path_buf))
+       strncpy ((char *) path_buf, (const char *) cache_file, dir_len);
     
     file = 0;
     name = 0;
+    path = 0;
     while ((file = FcFileCacheReadString (f, file_buf, sizeof (file_buf))) &&
           FcFileCacheReadInt (f, &id) &&
           (name = FcFileCacheReadString (f, name_buf, sizeof (name_buf))))
     {
-       font = FcNameParse (name);
-       if (font)
+       file_len = strlen ((const char *) file);
+       if (dir_len + file_len + 1 > sizeof (path_buf))
+       {
+           path = malloc (dir_len + file_len + 1);
+           if (!path)
+               goto bail2;
+           strncpy ((char *) path, (const char *) cache_file, dir_len);
+       }
+       else
+           path = path_buf;
+       
+       strcpy ((char *) path + dir_len, (const char *) file);
+       if (!FcStrCmp (name, FC_FONT_FILE_DIR))
        {
-           strcpy ((char *) base, (const char *) file);
            if (FcDebug () & FC_DBG_CACHEV)
            {
-               printf (" dir cache file \"%s\"\n", file);
+               printf (" dir cache dir \"%s\"\n", path);
            }
-           FcPatternAddString (font, FC_FILE, path);
-           if (!FcFontSetAdd (set, font))
+           if (!FcStrSetAdd (dirs, path))
                goto bail2;
        }
+       else
+       {
+           font = FcNameParse (name);
+           if (font)
+           {
+               if (FcDebug () & FC_DBG_CACHEV)
+               {
+                   printf (" dir cache file \"%s\"\n", file);
+               }
+               FcPatternAddString (font, FC_FILE, path);
+               if (!FcFontSetAdd (set, font))
+                   goto bail2;
+           }
+       }
+       if (path != path_buf)
+           free (path);
        if (file != file_buf)
            free (file);
        if (name != name_buf)
            free (name);
-       file = name = 0;
+       path = file = name = 0;
     }
     if (FcDebug () & FC_DBG_CACHE)
     {
@@ -554,7 +614,8 @@ FcFileCacheReadDir (FcFontSet *set, const FcChar8 *cache_file)
     
     ret = FcTrue;
 bail2:
-    free (path);
+    if (path && path != path_buf)
+       free (path);
     if (file && file != file_buf)
        free (file);
     if (name && name != name_buf)
@@ -565,8 +626,24 @@ bail0:
     return ret;
 }
 
+/*
+ * return the path from the directory containing 'cache' to 'file'
+ */
+
+static const FcChar8 *
+FcFileBaseName (const FcChar8 *cache, const FcChar8 *file)
+{
+    const FcChar8   *cache_slash;
+
+    cache_slash = (const FcChar8 *) strrchr ((const char *) cache, '/');
+    if (cache_slash && !strncmp ((const char *) cache, (const char *) file,
+                                (cache_slash + 1) - cache))
+       return file + ((cache_slash + 1) - cache);
+    return file;
+}
+
 FcBool
-FcFileCacheWriteDir (FcFontSet *set, const FcChar8 *cache_file)
+FcFileCacheWriteDir (FcFontSet *set, FcStrSet *dirs, const FcChar8 *cache_file)
 {
     FcPattern      *font;
     FILE           *f;
@@ -575,6 +652,8 @@ FcFileCacheWriteDir (FcFontSet *set, const FcChar8 *cache_file)
     int                    n;
     int                    id;
     FcBool         ret;
+    FcStrList      *list;
+    FcChar8        *dir;
 
     if (FcDebug () & FC_DBG_CACHE)
        printf ("FcFileCacheWriteDir cache_file \"%s\"\n", cache_file);
@@ -586,38 +665,59 @@ FcFileCacheWriteDir (FcFontSet *set, const FcChar8 *cache_file)
            printf (" can't create \"%s\"\n", cache_file);
        goto bail0;
     }
+    
+    list = FcStrListCreate (dirs);
+    if (!list)
+       goto bail1;
+    
+    while ((dir = FcStrListNext (list)))
+    {
+       base = FcFileBaseName (cache_file, dir);
+       if (!FcFileCacheWriteString (f, base))
+           goto bail2;
+       if (putc (' ', f) == EOF)
+           goto bail2;
+       if (!FcFileCacheWriteInt (f, 0))
+           goto bail2;
+        if (putc (' ', f) == EOF)
+           goto bail2;
+       if (!FcFileCacheWriteString (f, FC_FONT_FILE_DIR))
+           goto bail2;
+       if (putc ('\n', f) == EOF)
+           goto bail2;
+    }
+    
     for (n = 0; n < set->nfont; n++)
     {
        font = set->fonts[n];
        if (FcPatternGetString (font, FC_FILE, 0, (FcChar8 **) &file) != FcResultMatch)
-           goto bail1;
-       base = (FcChar8 *) strrchr ((char *) file, '/');
-       if (base)
-           base = base + 1;
-       else
-           base = file;
+           goto bail2;
+       base = FcFileBaseName (cache_file, file);
        if (FcPatternGetInteger (font, FC_INDEX, 0, &id) != FcResultMatch)
-           goto bail1;
+           goto bail2;
        if (FcDebug () & FC_DBG_CACHEV)
            printf (" write file \"%s\"\n", base);
        if (!FcFileCacheWriteString (f, base))
-           goto bail1;
+           goto bail2;
        if (putc (' ', f) == EOF)
-           goto bail1;
+           goto bail2;
        if (!FcFileCacheWriteInt (f, id))
-           goto bail1;
+           goto bail2;
         if (putc (' ', f) == EOF)
-           goto bail1;
+           goto bail2;
        name = FcNameUnparse (font);
        if (!name)
-           goto bail1;
+           goto bail2;
        ret = FcFileCacheWriteString (f, name);
        free (name);
        if (!ret)
-           goto bail1;
+           goto bail2;
        if (putc ('\n', f) == EOF)
-           goto bail1;
+           goto bail2;
     }
+    
+    FcStrListDone (list);
+
     if (fclose (f) == EOF)
        goto bail0;
     
@@ -625,6 +725,8 @@ FcFileCacheWriteDir (FcFontSet *set, const FcChar8 *cache_file)
        printf (" cache written\n");
     return FcTrue;
     
+bail2:
+    FcStrListDone (list);
 bail1:
     fclose (f);
 bail0:
index f838639a852c9858663b2f65a96884ac51ef70db..a35215ae8c042fa2e4fe85fd7cdb30dccc768489 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $XFree86: xc/lib/fontconfig/src/fccfg.c,v 1.4 2002/02/24 01:23:35 keithp Exp $
+ * $XFree86: xc/lib/fontconfig/src/fccfg.c,v 1.5 2002/03/01 01:00:54 keithp Exp $
  *
  * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
  *
@@ -22,9 +22,6 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
 #include "fcint.h"
 
 FcConfig    *_fcConfig;
@@ -38,20 +35,23 @@ FcConfigCreate (void)
     config = malloc (sizeof (FcConfig));
     if (!config)
        goto bail0;
+    FcMemAlloc (FC_MEM_CONFIG, sizeof (FcConfig));
     
-    config->dirs = malloc (sizeof (char *));
-    if (!config->dirs)
+    config->configDirs = FcStrSetCreate ();
+    if (!config->configDirs)
        goto bail1;
-    config->dirs[0] = 0;
     
-    config->configFiles = malloc (sizeof (char *));
+    config->configFiles = FcStrSetCreate ();
     if (!config->configFiles)
        goto bail2;
-    config->configFiles[0] = 0;
+    
+    config->fontDirs = FcStrSetCreate ();
+    if (!config->fontDirs)
+       goto bail3;
     
     config->cache = 0;
     if (!FcConfigSetCache (config, (FcChar8 *) ("~/" FC_USER_CACHE_FILE)))
-       goto bail3;
+       goto bail4;
 
     config->blanks = 0;
 
@@ -60,19 +60,74 @@ FcConfigCreate (void)
     config->maxObjects = 0;
     for (set = FcSetSystem; set <= FcSetApplication; set++)
        config->fonts[set] = 0;
+
+    config->rescanTime = time(0);
+    config->rescanInterval = 30;    
     
     return config;
 
+bail4:
+    FcStrSetDestroy (config->fontDirs);
 bail3:
-    free (config->configFiles);
+    FcStrSetDestroy (config->configFiles);
 bail2:
-    free (config->dirs);
+    FcStrSetDestroy (config->configDirs);
 bail1:
     free (config);
+    FcMemFree (FC_MEM_CONFIG, sizeof (FcConfig));
 bail0:
     return 0;
 }
 
+static time_t
+FcConfigNewestFile (FcStrSet *files)
+{
+    FcStrList      *list = FcStrListCreate (files);
+    FcBool         set = FcFalse;
+    time_t         newest = 0;
+    FcChar8        *file;
+    struct  stat    statb;
+
+    if (list)
+    {
+       while ((file = FcStrListNext (list)))
+       {
+           if (stat ((char *) file, &statb) == 0)
+           {
+               if (!set)
+                   newest = statb.st_mtime;
+               else if (statb.st_mtime - newest > 0)
+                   newest = statb.st_mtime;
+           }
+       }
+       FcStrListDone (list);
+    }
+    return newest;
+}
+
+FcBool
+FcConfigUptoDate (FcConfig *config)
+{
+    time_t  config_time;
+    time_t  font_time;
+    time_t  now = time(0);
+    if (!config)
+    {
+       config = FcConfigGetCurrent ();
+       if (!config)
+           return FcFalse;
+    }
+    config_time = FcConfigNewestFile (config->configFiles);
+    font_time = FcConfigNewestFile (config->configDirs);
+    if (config_time - config->rescanTime > 0 ||
+       font_time - config->rescanTime > 0)
+    {
+       return FcFalse;
+    }
+    config->rescanTime = now;
+    return FcTrue;
+}
+
 static void
 FcSubstDestroy (FcSubst *s)
 {
@@ -87,51 +142,27 @@ FcSubstDestroy (FcSubst *s)
     }
 }
 
-static void
-FcConfigDestroyStrings (FcChar8 **strings)
-{
-    FcChar8    **s;
-
-    for (s = strings; s && *s; s++)
-       free (*s);
-    if (strings)
-       free (strings);
-}
-    
-static FcBool
-FcConfigAddString (FcChar8 ***strings, FcChar8 *string)
-{
-    int            n;
-    FcChar8    **s;
-    
-    n = 0;
-    for (s = *strings; s && *s; s++)
-       n++;
-    s = malloc ((n + 2) * sizeof (FcChar8 *));
-    if (!s)
-       return FcFalse;
-    s[n] = string;
-    s[n+1] = 0;
-    memcpy (s, *strings, n * sizeof (FcChar8 *));
-    free (*strings);
-    *strings = s;
-    return FcTrue;
-}
-
 void
 FcConfigDestroy (FcConfig *config)
 {
     FcSetName  set;
-    FcConfigDestroyStrings (config->dirs);
-    FcConfigDestroyStrings (config->configFiles);
 
-    free (config->cache);
+    if (config == _fcConfig)
+       _fcConfig = 0;
+
+    FcStrSetDestroy (config->configDirs);
+    FcStrSetDestroy (config->fontDirs);
+    FcStrSetDestroy (config->configFiles);
+
+    FcStrFree (config->cache);
 
     FcSubstDestroy (config->substPattern);
     FcSubstDestroy (config->substFont);
     for (set = FcSetSystem; set <= FcSetApplication; set++)
        if (config->fonts[set])
            FcFontSetDestroy (config->fonts[set]);
+    free (config);
+    FcMemFree (FC_MEM_CONFIG, sizeof (FcConfig));
 }
 
 /*
@@ -145,7 +176,8 @@ FcConfigBuildFonts (FcConfig *config)
 {
     FcFontSet   *fonts;
     FcFileCache *cache;
-    FcChar8    **d;
+    FcStrList  *list;
+    FcChar8    *dir;
 
     fonts = FcFontSetCreate ();
     if (!fonts)
@@ -157,13 +189,19 @@ FcConfigBuildFonts (FcConfig *config)
 
     FcFileCacheLoad (cache, config->cache);
 
-    for (d = config->dirs; d && *d; d++)
+    list = FcConfigGetFontDirs (config);
+    if (!list)
+       goto bail1;
+
+    while ((dir = FcStrListNext (list)))
     {
        if (FcDebug () & FC_DBG_FONTSET)
-           printf ("scan dir %s\n", *d);
-       FcDirScan (fonts, cache, config->blanks, *d, FcFalse);
+           printf ("scan dir %s\n", dir);
+       FcDirScan (fonts, config->fontDirs, cache, config->blanks, dir, FcFalse);
     }
     
+    FcStrListDone (list);
+    
     if (FcDebug () & FC_DBG_FONTSET)
        FcFontSetPrint (fonts);
 
@@ -202,40 +240,41 @@ FcConfigGetCurrent (void)
 }
 
 FcBool
-FcConfigAddDir (FcConfig    *config,
-               const FcChar8  *d)
+FcConfigAddConfigDir (FcConfig     *config,
+                     const FcChar8 *d)
 {
-    FcChar8    *dir;
-    FcChar8    *h;
+    return FcStrSetAddFilename (config->configDirs, d);
+}
 
-    if (*d == '~')
-    {
-       h = (FcChar8 *) getenv ("HOME");
-       if (!h)
-           return FcFalse;
-       dir = (FcChar8 *) malloc (strlen ((char *) h) + strlen ((char *) d));
-       if (!dir)
-           return FcFalse;
-       strcpy ((char *) dir, (char *) h);
-       strcat ((char *) dir, (char *) d+1);
-    }
-    else
-    {
-       dir = (FcChar8 *) malloc (strlen ((char *) d) + 1);
-       if (!dir)
-           return FcFalse;
-       strcpy ((char *) dir, (const char *) d);
-    }
-    if (!FcConfigAddString (&config->dirs, dir))
+FcStrList *
+FcConfigGetConfigDirs (FcConfig   *config)
+{
+    if (!config)
     {
-       free (dir);
-       return FcFalse;
+       config = FcConfigGetCurrent ();
+       if (!config)
+           return 0;
     }
-    return FcTrue;
+    return FcStrListCreate (config->configDirs);
+}
+
+FcBool
+FcConfigAddFontDir (FcConfig       *config,
+                   const FcChar8   *d)
+{
+    return FcStrSetAddFilename (config->fontDirs, d);
 }
 
-FcChar8 **
-FcConfigGetDirs (FcConfig   *config)
+FcBool
+FcConfigAddDir (FcConfig           *config,
+               const FcChar8       *d)
+{
+    return (FcConfigAddConfigDir (config, d) && 
+           FcConfigAddFontDir (config, d));
+}
+
+FcStrList *
+FcConfigGetFontDirs (FcConfig  *config)
 {
     if (!config)
     {
@@ -243,26 +282,25 @@ FcConfigGetDirs (FcConfig   *config)
        if (!config)
            return 0;
     }
-    return config->dirs;
+    return FcStrListCreate (config->fontDirs);
 }
 
 FcBool
 FcConfigAddConfigFile (FcConfig            *config,
                       const FcChar8   *f)
 {
-    FcChar8    *file;
-    file = FcConfigFilename (f);
+    FcBool     ret;
+    FcChar8    *file = FcConfigFilename (f);
+    
     if (!file)
        return FcFalse;
-    if (!FcConfigAddString (&config->configFiles, file))
-    {
-       free (file);
-       return FcFalse;
-    }
-    return FcTrue;
+    
+    ret = FcStrSetAdd (config->configFiles, file);
+    FcStrFree (file);
+    return ret;
 }
 
-FcChar8 **
+FcStrList *
 FcConfigGetConfigFiles (FcConfig    *config)
 {
     if (!config)
@@ -271,33 +309,19 @@ FcConfigGetConfigFiles (FcConfig    *config)
        if (!config)
            return 0;
     }
-    return config->configFiles;
+    return FcStrListCreate (config->configFiles);
 }
 
 FcBool
 FcConfigSetCache (FcConfig     *config,
                  const FcChar8 *c)
 {
-    FcChar8    *new;
-    FcChar8    *h;
-
-    if (*c == '~')
-    {
-       h = (FcChar8 *) getenv ("HOME");
-       if (!h)
-           return FcFalse;
-       new = (FcChar8 *) malloc (strlen ((char *) h) + strlen ((char *) c));
-       if (!new)
-           return FcFalse;
-       strcpy ((char *) new, (char *) h);
-       strcat ((char *) new, (char *) c+1);
-    }
-    else
-    {
-       new = FcStrCopy (c);
-    }
+    FcChar8    *new = FcStrCopyFilename (c);
+    
+    if (!new)
+       return FcFalse;
     if (config->cache)
-       free (config->cache);
+       FcStrFree (config->cache);
     config->cache = new;
     return FcTrue;
 }
@@ -337,6 +361,8 @@ FcConfigSetFonts (FcConfig  *config,
     config->fonts[set] = fonts;
 }
 
+
+
 FcBlanks *
 FcConfigGetBlanks (FcConfig    *config)
 {
@@ -368,6 +394,31 @@ FcConfigAddBlank (FcConfig *config,
     return FcTrue;
 }
 
+int
+FcConfigGetRescanInverval (FcConfig *config)
+{
+    if (!config)
+    {
+       config = FcConfigGetCurrent ();
+       if (!config)
+           return 0;
+    }
+    return config->rescanInterval;
+}
+
+FcBool
+FcConfigSetRescanInverval (FcConfig *config, int rescanInterval)
+{
+    if (!config)
+    {
+       config = FcConfigGetCurrent ();
+       if (!config)
+           return FcFalse;
+    }
+    config->rescanInterval = rescanInterval;
+    return FcTrue;
+}
+
 FcBool
 FcConfigAddEdit (FcConfig      *config,
                 FcTest         *test,
@@ -805,22 +856,37 @@ FcConfigMatchValueList (FcPattern *p,
                        FcTest          *t,
                        FcValueList     *v)
 {
-    FcValueList    *ret = 0;
-    FcValue        value = FcConfigEvaluate (p, t->expr);
+    FcValueList            *ret = 0;
+    FcExpr         *e = t->expr;
+    FcValue        value;
     
-    for (; v; v = v->next)
+    while (e)
     {
-       if (FcConfigCompareValue (v->value, t->op, value))
+       if (e->op == FcOpComma)
        {
-           if (!ret)
-               ret = v;
+           value = FcConfigEvaluate (p, e->u.tree.left);
+           e = e->u.tree.right;
        }
        else
        {
-           if (t->qual == FcQualAll)
+           value = FcConfigEvaluate (p, e);
+           e = 0;
+       }
+
+       for (; v; v = v->next)
+       {
+           if (FcConfigCompareValue (v->value, t->op, value))
            {
-               ret = 0;
-               break;
+               if (!ret)
+                   ret = v;
+           }
+           else
+           {
+               if (t->qual == FcQualAll)
+               {
+                   ret = 0;
+                   break;
+               }
            }
        }
     }
@@ -1323,6 +1389,9 @@ FcConfigAppFontAddFile (FcConfig    *config,
                        const FcChar8  *file)
 {
     FcFontSet  *set;
+    FcStrSet   *subdirs;
+    FcStrList  *sublist;
+    FcChar8    *subdir;
 
     if (!config)
     {
@@ -1331,15 +1400,36 @@ FcConfigAppFontAddFile (FcConfig    *config,
            return FcFalse;
     }
 
+    subdirs = FcStrSetCreate ();
+    if (!subdirs)
+       return FcFalse;
+    
     set = FcConfigGetFonts (config, FcSetApplication);
     if (!set)
     {
        set = FcFontSetCreate ();
        if (!set)
+       {
+           FcStrSetDestroy (subdirs);
            return FcFalse;
+       }
        FcConfigSetFonts (config, set, FcSetApplication);
     }
-    return FcFileScan (set, 0, config->blanks, file, FcFalse);
+       
+    if (!FcFileScan (set, subdirs, 0, config->blanks, file, FcFalse))
+    {
+       FcStrSetDestroy (subdirs);
+       return FcFalse;
+    }
+    if ((sublist = FcStrListCreate (subdirs)))
+    {
+       while ((subdir = FcStrListNext (sublist)))
+       {
+           FcConfigAppFontAddDir (config, subdir);
+       }
+       FcStrListDone (sublist);
+    }
+    return FcTrue;
 }
 
 FcBool
@@ -1347,6 +1437,9 @@ FcConfigAppFontAddDir (FcConfig       *config,
                       const FcChar8   *dir)
 {
     FcFontSet  *set;
+    FcStrSet   *subdirs;
+    FcStrList  *sublist;
+    FcChar8    *subdir;
     
     if (!config)
     {
@@ -1354,15 +1447,36 @@ FcConfigAppFontAddDir (FcConfig     *config,
        if (!config)
            return FcFalse;
     }
+    subdirs = FcStrSetCreate ();
+    if (!subdirs)
+       return FcFalse;
+    
     set = FcConfigGetFonts (config, FcSetApplication);
     if (!set)
     {
        set = FcFontSetCreate ();
        if (!set)
+       {
+           FcStrSetDestroy (subdirs);
            return FcFalse;
+       }
        FcConfigSetFonts (config, set, FcSetApplication);
     }
-    return FcDirScan (set, 0, config->blanks, dir, FcFalse);
+    
+    if (!FcDirScan (set, subdirs, 0, config->blanks, dir, FcFalse))
+    {
+       FcStrSetDestroy (subdirs);
+       return FcFalse;
+    }
+    if ((sublist = FcStrListCreate (subdirs)))
+    {
+       while ((subdir = FcStrListNext (sublist)))
+       {
+           FcConfigAppFontAddDir (config, subdir);
+       }
+       FcStrListDone (sublist);
+    }
+    return FcTrue;
 }
 
 void
index c8284368243dfb0b3dd279c4a039c0ecd8f84bb5..ac72b7a73f7647f7b7404fce834996c123f27b3e 100644 (file)
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-#include <sys/types.h>
-#include <dirent.h>
-#include <stdlib.h>
-#include <string.h>
 #include "fcint.h"
+#include <dirent.h>
+
+static FcBool
+FcFileIsDir (const FcChar8 *file)
+{
+    struct stat            statb;
 
-#define FC_INVALID_FONT_FILE "."
+    if (stat ((const char *) file, &statb) != 0)
+       return FcFalse;
+    return S_ISDIR(statb.st_mode);
+}
 
 FcBool
 FcFileScan (FcFontSet      *set,
+           FcStrSet        *dirs,
            FcFileCache     *cache,
            FcBlanks        *blanks,
            const FcChar8   *file,
@@ -41,6 +47,7 @@ FcFileScan (FcFontSet     *set,
     FcChar8        *name;
     FcPattern      *font;
     FcBool         ret = FcTrue;
+    FcBool         isDir;
     int                    count;
     
     id = 0;
@@ -53,14 +60,19 @@ FcFileScan (FcFontSet           *set,
        if (name)
        {
            /* "." means the file doesn't contain a font */
-           if (strcmp ((const char *) name, FC_INVALID_FONT_FILE) != 0)
+           if (FcStrCmp (name, FC_FONT_FILE_INVALID) == 0)
+               font = 0;
+           else if (FcStrCmp (name, FC_FONT_FILE_DIR) == 0)
+           {
+               ret = FcStrSetAdd (dirs, file);
+               font = 0;
+           }
+           else
            {
                font = FcNameParse (name);
                if (font)
                    FcPatternAddString (font, FC_FILE, file);
            }
-           else
-               font = 0;
        }
        else
        {
@@ -72,6 +84,12 @@ FcFileScan (FcFontSet            *set,
            font = FcFreeTypeQuery (file, id, blanks, &count);
            if (FcDebug () & FC_DBG_SCAN)
                printf ("done\n");
+           isDir = FcFalse;
+           if (!font && FcFileIsDir (file))
+           {
+               isDir = FcTrue;
+               ret = FcStrSetAdd (dirs, file);
+           }
            if (!force && cache)
            {
                if (font)
@@ -87,8 +105,17 @@ FcFileScan (FcFontSet           *set,
                }
                else
                {
-                   /* negative cache files not containing fonts */
-                   FcFileCacheUpdate (cache, file, id, (FcChar8 *) FC_INVALID_FONT_FILE);
+                   if (isDir)
+                   {
+                       FcFileCacheUpdate (cache, file, id, (FcChar8 *) 
+                                          FC_FONT_FILE_DIR);
+                   }
+                   else
+                   {
+                       /* negative cache files not containing fonts */
+                       FcFileCacheUpdate (cache, file, id, (FcChar8 *) 
+                                          FC_FONT_FILE_INVALID);
+                   }
                }
            }
        }
@@ -106,8 +133,29 @@ FcFileScan (FcFontSet          *set,
     return ret;
 }
 
+FcBool
+FcDirCacheValid (const FcChar8 *dir)
+{
+    FcChar8 *path;
+    FcBool  ret;
+
+    path = (FcChar8 *) malloc (strlen ((const char *) dir) + 1 + 
+                              strlen ((const char *) FC_DIR_CACHE_FILE) + 1);
+    if (!path)
+       return FcFalse;
+    strcpy ((char *) path, (const char *) dir);
+    strcat ((char *) path, (const char *) "/");
+    strcat ((char *) path, (const char *) FC_DIR_CACHE_FILE);
+    ret = FcFileCacheValid (path);
+    free (path);
+    return ret;
+}
+
+#define FC_MAX_FILE_LEN            4096
+
 FcBool
 FcDirScan (FcFontSet       *set,
+          FcStrSet         *dirs,
           FcFileCache      *cache,
           FcBlanks         *blanks,
           const FcChar8    *dir,
@@ -119,7 +167,7 @@ FcDirScan (FcFontSet            *set,
     FcChar8        *base;
     FcBool         ret = FcTrue;
 
-    file = (FcChar8 *) malloc (strlen ((char *) dir) + 1 + 256 + 1);
+    file = (FcChar8 *) malloc (strlen ((char *) dir) + 1 + FC_MAX_FILE_LEN + 1);
     if (!file)
        return FcFalse;
 
@@ -130,7 +178,7 @@ FcDirScan (FcFontSet            *set,
     {
        strcpy ((char *) base, FC_DIR_CACHE_FILE);
        
-       if (FcFileCacheReadDir (set, file))
+       if (FcFileCacheReadDir (set, dirs, file))
        {
            free (file);
            return FcTrue;
@@ -141,14 +189,17 @@ FcDirScan (FcFontSet          *set,
     if (!d)
     {
        free (file);
+       /* Don't complain about missing directories */
+       if (errno == ENOENT)
+           return FcTrue;
        return FcFalse;
     }
     while (ret && (e = readdir (d)))
     {
-       if (e->d_name[0] != '.')
+       if (e->d_name[0] != '.' && strlen (e->d_name) < FC_MAX_FILE_LEN)
        {
            strcpy ((char *) base, (char *) e->d_name);
-           ret = FcFileScan (set, cache, blanks, file, force);
+           ret = FcFileScan (set, dirs, cache, blanks, file, force);
        }
     }
     free (file);
@@ -157,7 +208,7 @@ FcDirScan (FcFontSet            *set,
 }
 
 FcBool
-FcDirSave (FcFontSet *set, const FcChar8 *dir)
+FcDirSave (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir)
 {
     FcChar8        *file;
     FcChar8        *base;
@@ -171,8 +222,7 @@ FcDirSave (FcFontSet *set, const FcChar8 *dir)
     strcat ((char *) file, "/");
     base = file + strlen ((char *) file);
     strcpy ((char *) base, FC_DIR_CACHE_FILE);
-    ret = FcFileCacheWriteDir (set, file);
+    ret = FcFileCacheWriteDir (set, dirs, file);
     free (file);
     return ret;
 }
-
index 80324fbe71ae1c8194fb30ee677a51c5f11370a0..8154b659b0815929cef532caa5e102f559a1b284 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $XFree86: xc/lib/fontconfig/src/fcinit.c,v 1.2 2002/02/15 06:01:28 keithp Exp $
+ * $XFree86: xc/lib/fontconfig/src/fcinit.c,v 1.3 2002/02/19 08:33:23 keithp Exp $
  *
  * Copyright © 2001 Keith Packard, member of The XFree86 Project, Inc.
  *
 #include <stdlib.h>
 #include "fcint.h"
 
-FcBool
-FcInitFonts (void)
-{
-    FcConfig   *config;
-
-    config = FcConfigGetCurrent ();
-    if (!config)
-       return FcFalse;
-
-    if (FcConfigGetFonts (config, FcSetSystem))
-       return FcTrue;
-
-    return FcConfigBuildFonts (config);
-}
-
-static FcBool
+static FcConfig *
 FcInitFallbackConfig (void)
 {
     FcConfig   *config;
@@ -50,25 +35,21 @@ FcInitFallbackConfig (void)
        goto bail0;
     if (!FcConfigAddDir (config, (FcChar8 *) FC_FALLBACK_FONTS))
        goto bail1;
-    FcConfigSetCurrent (config);
-    return FcTrue;
+    return config;
 
 bail1:
     FcConfigDestroy (config);
 bail0:
-    return FcFalse;
+    return 0;
 }
 
 /*
- * Locate and parse the configuration file
+ * Load the configuration files
  */
-FcBool
-FcInitConfig (void)
+FcConfig *
+FcInitLoadConfig (void)
 {
-    FcConfig    *config;
-    
-    if (_fcConfig)
-       return FcTrue;
+    FcConfig   *config;
     
     config = FcConfigCreate ();
     if (!config)
@@ -79,15 +60,83 @@ FcInitConfig (void)
        FcConfigDestroy (config);
        return FcInitFallbackConfig ();
     }
-    
+
+    return config;
+}
+
+/*
+ * Load the configuration files and scan for available fonts
+ */
+FcConfig *
+FcInitLoadConfigAndFonts (void)
+{
+    FcConfig   *config = FcInitLoadConfig ();
+
+    if (!config)
+       return 0;
+    if (!FcConfigBuildFonts (config))
+    {
+       FcConfigDestroy (config);
+       return 0;
+    }
+    return config;
+}
+
+/*
+ * Initialize the default library configuration
+ */
+FcBool
+FcInit (void)
+{
+    FcConfig   *config;
+
+    if (_fcConfig)
+       return FcTrue;
+    config = FcInitLoadConfigAndFonts ();
+    if (!config)
+       return FcTrue;
+    FcConfigSetCurrent (config);
+    return FcTrue;
+}
+
+/*
+ * Reread the configuration and available font lists
+ */
+FcBool
+FcInitReinitialize (void)
+{
+    FcConfig   *config;
+
+    config = FcInitLoadConfigAndFonts ();
+    if (!config)
+       return FcFalse;
     FcConfigSetCurrent (config);
     return FcTrue;
 }
 
 FcBool
-FcInit (void)
+FcInitBringUptoDate (void)
 {
-    return FcInitConfig () && FcInitFonts ();
+    FcConfig   *config = FcConfigGetCurrent ();
+    time_t     now;
+
+    /*
+     * rescanInterval == 0 disables automatic up to date
+     */
+    if (config->rescanInterval == 0)
+       return FcTrue;
+    /*
+     * Check no more often than rescanInterval seconds
+     */
+    now = time (0);
+    if (config->rescanTime + config->rescanInterval - now > 0)
+       return FcTrue;
+    /*
+     * If up to date, don't reload configuration
+     */
+    if (FcConfigUptoDate (0))
+       return FcTrue;
+    return FcInitReinitialize ();
 }
 
 static struct {
index b5b93fb74c3f9e91e9011513d74f7910fc5c5633..713d09c9864866a9057d29d392533b28fc38287c 100644 (file)
@@ -33,6 +33,7 @@
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <time.h>
 #include <fontconfig/fontconfig.h>
 #include <fontconfig/fcprivate.h>
 #ifdef HAVE_CONFIG_H
@@ -53,6 +54,9 @@ typedef struct _FcSymbolic {
 #define FC_CONFIG_PATH "fonts.conf"
 #endif
 
+#define FC_FONT_FILE_INVALID   ((FcChar8 *) ".")
+#define FC_FONT_FILE_DIR       ((FcChar8 *) ".dir")
+
 #define FC_DBG_MATCH   1
 #define FC_DBG_MATCHV  2
 #define FC_DBG_EDIT    4
@@ -77,6 +81,9 @@ typedef struct _FcSymbolic {
 #define FC_MEM_STRING      11
 #define FC_MEM_LISTBUCK            12
 #define FC_MEM_NUM         13
+#define FC_MEM_STRSET      14
+#define FC_MEM_STRLIST     15
+#define FC_MEM_CONFIG      16
 
 typedef struct _FcValueList {
     struct _FcValueList    *next;
@@ -173,6 +180,18 @@ struct _FcCharSet {
     FcCharNode     node;
 };
 
+struct _FcStrSet {
+    int                    ref;        /* reference count */
+    int                    num;
+    int                    size;
+    FcChar8        **strs;
+};
+
+struct _FcStrList {
+    FcStrSet       *set;
+    int                    n;
+};
+
 typedef struct _FcStrBuf {
     FcChar8 *buf;
     FcBool  allocated;
@@ -219,18 +238,24 @@ struct _FcConfig {
      * cache file must be consulted before the directories are scanned,
      * and those directives may occur in any order
      */
-    FcChar8    **dirs;             /* directories containing fonts */
+    FcStrSet   *configDirs;        /* directories to scan for fonts */
     FcChar8    *cache;             /* name of per-user cache file */
     /*
      * Set of allowed blank chars -- used to
      * trim fonts of bogus glyphs
      */
     FcBlanks   *blanks;
+    /*
+     * List of directories containing fonts,
+     * built by recursively scanning the set 
+     * of configured directories
+     */
+    FcStrSet   *fontDirs;
     /*
      * Names of all of the configuration files used
      * to create this configuration
      */
-    FcChar8    **configFiles;      /* config files loaded */
+    FcStrSet   *configFiles;       /* config files loaded */
     /*
      * Substitution instructions for patterns and fonts;
      * maxObjects is used to allocate appropriate intermediate storage
@@ -246,6 +271,14 @@ struct _FcConfig {
      * match preferrentially
      */
     FcFontSet  *fonts[FcSetApplication + 1];
+    /*
+     * Fontconfig can periodically rescan the system configuration
+     * and font directories.  This rescanning occurs when font
+     * listing requests are made, but no more often than rescanInterval
+     * seconds apart.
+     */
+    time_t     rescanTime;         /* last time information was scanned */
+    int                rescanInterval;     /* interval between scans */
 };
  
 extern FcConfig        *_fcConfig;
@@ -266,6 +299,9 @@ FcFileCacheFind (FcFileCache        *cache,
 void
 FcFileCacheDestroy (FcFileCache        *cache);
 
+FcBool
+FcFileCacheValid (const FcChar8 *cache_file);
+
 void
 FcFileCacheLoad (FcFileCache   *cache,
                 const FcChar8  *cache_file);
@@ -281,13 +317,21 @@ FcFileCacheSave (FcFileCache      *cache,
                 const FcChar8  *cache_file);
 
 FcBool
-FcFileCacheReadDir (FcFontSet *set, const FcChar8 *cache_file);
+FcFileCacheReadDir (FcFontSet *set, FcStrSet *dirs, const FcChar8 *cache_file);
 
 FcBool
-FcFileCacheWriteDir (FcFontSet *set, const FcChar8 *cache_file);
+FcFileCacheWriteDir (FcFontSet *set, FcStrSet *dirs, const FcChar8 *cache_file);
     
 /* fccfg.c */
 
+FcBool
+FcConfigAddConfigDir (FcConfig     *config,
+                     const FcChar8 *d);
+
+FcBool
+FcConfigAddFontDir (FcConfig       *config,
+                   const FcChar8   *d);
+
 FcBool
 FcConfigAddDir (FcConfig       *config,
                const FcChar8   *d);
index 17343be0a2e9410d6082e286d942087c01b437ba..176017dbc86ea94148f8c1d11af3e9869a8dd729 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $XFree86: $
+ * $XFree86: xc/lib/fontconfig/src/fclist.c,v 1.2 2002/02/28 16:51:48 keithp Exp $
  *
  * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
  *
@@ -372,6 +372,9 @@ FcFontSetList (FcConfig         *config,
 
     if (!config)
     {
+       if (!FcInitBringUptoDate ())
+           goto bail0;
+
        config = FcConfigGetCurrent ();
        if (!config)
            goto bail0;
index 6cf7d7022a9a51dc88b4e309c7bc14999347d400..796ccc320b33762ae3d5435a7c0e76711218bd00 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $XFree86: xc/lib/fontconfig/src/fcstr.c,v 1.2 2002/02/15 06:01:28 keithp Exp $
+ * $XFree86: xc/lib/fontconfig/src/fcstr.c,v 1.3 2002/02/18 22:29:28 keithp Exp $
  *
  * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
  *
@@ -82,6 +82,25 @@ FcStrCmpIgnoreCase (const FcChar8 *s1, const FcChar8 *s2)
     return (int) c2 - (int) c1;
 }
 
+int
+FcStrCmp (const FcChar8 *s1, const FcChar8 *s2)
+{
+    FcChar8 c1, c2;
+    
+    if (s1 == s2)
+       return 0;
+    for (;;) 
+    {
+       c1 = *s1++;
+       c2 = *s2++;
+       if (!c1 || !c2)
+           break;
+       if (c1 != c2)
+           break;
+    }
+    return (int) c2 - (int) c1;
+}
+
 int
 FcUtf8ToUcs4 (FcChar8   *src_orig,
              FcChar32  *dst,
@@ -276,3 +295,210 @@ FcStrBufData (FcStrBuf *buf, const FcChar8 *s, int len)
     return FcTrue;
 }
 
+FcChar8 *
+FcStrCopyFilename (const FcChar8 *s)
+{
+    FcChar8 *new;
+    
+    if (*s == '~')
+    {
+       FcChar8 *home = (FcChar8 *) getenv ("HOME");
+       int     size = strlen ((char *) home) + strlen ((char *) s);
+       if (!home)
+           return 0;
+       new = (FcChar8 *) malloc (size);
+       if (!new)
+           return 0;
+       FcMemAlloc (FC_MEM_STRING, size);
+       strcpy ((char *) new, (char *) home);
+       strcat ((char *) new, (char *) s + 1);
+    }
+    else
+    {
+       int     size = strlen ((char *) s) + 1;
+       new = (FcChar8 *) malloc (size);
+       if (!new)
+           return 0;
+       FcMemAlloc (FC_MEM_STRING, size);
+       strcpy ((char *) new, (const char *) s);
+    }
+    return new;
+}
+
+FcChar8 *
+FcStrDirname (const FcChar8 *file)
+{
+    FcChar8 *slash;
+    FcChar8 *dir;
+
+    slash = (FcChar8 *) strrchr ((char *) file, '/');
+    if (!slash)
+       return FcStrCopy ((FcChar8 *) ".");
+    dir = malloc ((slash - file) + 1);
+    if (!dir)
+       return 0;
+    FcMemAlloc (FC_MEM_STRING, (slash - file) + 1);
+    strncpy ((char *) dir, (const char *) file, slash - file);
+    dir[slash - file] = '\0';
+    return dir;
+}
+
+FcChar8 *
+FcStrBasename (const FcChar8 *file)
+{
+    FcChar8 *slash;
+
+    slash = (FcChar8 *) strrchr ((char *) file, '/');
+    if (!slash)
+       return FcStrCopy (file);
+    return FcStrCopy (slash + 1);
+}
+
+FcStrSet *
+FcStrSetCreate (void)
+{
+    FcStrSet   *set = malloc (sizeof (FcStrSet));
+    if (!set)
+       return 0;
+    FcMemAlloc (FC_MEM_STRSET, sizeof (FcStrSet));
+    set->ref = 1;
+    set->num = 0;
+    set->size = 0;
+    set->strs = 0;
+    return set;
+}
+
+static FcBool
+_FcStrSetAppend (FcStrSet *set, FcChar8 *s)
+{
+    if (FcStrSetMember (set, s))
+    {
+       FcStrFree (s);
+       return FcTrue;
+    }
+    if (set->num == set->size)
+    {
+       FcChar8 **strs = malloc ((set->size + 2) * sizeof (FcChar8 *));
+
+       if (!strs)
+           return FcFalse;
+       FcMemAlloc (FC_MEM_STRSET, (set->size + 2) * sizeof (FcChar8 *));
+       set->size = set->size + 1;
+       if (set->num)
+           memcpy (strs, set->strs, set->num * sizeof (FcChar8 *));
+       if (set->strs)
+           free (set->strs);
+       set->strs = strs;
+    }
+    set->strs[set->num++] = s;
+    set->strs[set->num] = 0;
+    return FcTrue;
+}
+
+FcBool
+FcStrSetMember (FcStrSet *set, const FcChar8 *s)
+{
+    int        i;
+
+    for (i = 0; i < set->num; i++)
+       if (!FcStrCmp (set->strs[i], s))
+           return FcTrue;
+    return FcFalse;
+}
+
+FcBool
+FcStrSetAdd (FcStrSet *set, const FcChar8 *s)
+{
+    FcChar8 *new = FcStrCopy (s);
+    if (!new)
+       return FcFalse;
+    if (!_FcStrSetAppend (set, new))
+    {
+       FcStrFree (new);
+       return FcFalse;
+    }
+    return FcTrue;
+}
+
+FcBool
+FcStrSetAddFilename (FcStrSet *set, const FcChar8 *s)
+{
+    FcChar8 *new = FcStrCopyFilename (s);
+    if (!new)
+       return FcFalse;
+    if (!_FcStrSetAppend (set, new))
+    {
+       FcStrFree (new);
+       return FcFalse;
+    }
+    return FcTrue;
+}
+
+FcBool
+FcStrSetDel (FcStrSet *set, const FcChar8 *s)
+{
+    int        i;
+
+    for (i = 0; i < set->num; i++)
+       if (!FcStrCmp (set->strs[i], s))
+       {
+           FcStrFree (set->strs[i]);
+           /*
+            * copy remaining string pointers and trailing
+            * NULL
+            */
+           memmove (&set->strs[i], &set->strs[i+1], 
+                    (set->num - i) * sizeof (FcChar8 *));
+           set->num--;
+           return FcTrue;
+       }
+    return FcFalse;
+}
+
+void
+FcStrSetDestroy (FcStrSet *set)
+{
+    if (--set->ref == 0)
+    {
+       int     i;
+    
+       for (i = 0; i < set->num; i++)
+           FcStrFree (set->strs[i]);
+       FcMemFree (FC_MEM_STRSET, (set->size) * sizeof (FcChar8 *));
+       if (set->strs)
+           free (set->strs);
+       FcMemFree (FC_MEM_STRSET, sizeof (FcStrSet));
+       free (set);
+    }
+}
+
+FcStrList *
+FcStrListCreate (FcStrSet *set)
+{
+    FcStrList  *list;
+
+    list = malloc (sizeof (FcStrList));
+    if (!list)
+       return 0;
+    FcMemAlloc (FC_MEM_STRLIST, sizeof (FcStrList));
+    list->set = set;
+    set->ref++;
+    list->n = 0;
+    return list;
+}
+
+FcChar8 *
+FcStrListNext (FcStrList *list)
+{
+    if (list->n >= list->set->num)
+       return 0;
+    return list->set->strs[list->n++];
+}
+
+void
+FcStrListDone (FcStrList *list)
+{
+    FcStrSetDestroy (list->set);
+    FcMemFree (FC_MEM_STRLIST, sizeof (FcStrList));
+    free (list);
+}
index 06f1112a9955ad357e5cd46e9bc8378497afadea..4993eb44f271230de096e53d54e55aea936e3423 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $XFree86: xc/lib/fontconfig/src/fcxml.c,v 1.5 2002/02/22 18:54:07 keithp Exp $
+ * $XFree86: xc/lib/fontconfig/src/fcxml.c,v 1.6 2002/02/28 16:51:48 keithp Exp $
  *
  * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
  *
  */
 
 #include <stdarg.h>
-#include <expat.h>
 #include "fcint.h"
+#if HAVE_XMLPARSE_H
+#include <xmlparse.h>
+#else
+#include <expat.h>
+#endif
 
 FcTest *
 FcTestCreate (FcQual qual, const FcChar8 *field, FcOp compare, FcExpr *expr)
@@ -270,6 +274,7 @@ typedef enum _FcElement {
     FcElementAlias,
        
     FcElementBlank,
+    FcElementRescan,
 
     FcElementPrefer,
     FcElementAccept,
@@ -319,6 +324,7 @@ FcElementMap (const XML_Char *name)
        { "alias",      FcElementAlias },
        
        { "blank",      FcElementBlank },
+       { "rescan",     FcElementRescan },
 
        { "prefer",     FcElementPrefer },
        { "accept",     FcElementAccept },
@@ -418,24 +424,36 @@ typedef struct _FcConfigParse {
     XML_Parser     parser;
 } FcConfigParse;
 
+typedef enum _FcConfigSeverity {
+    FcSevereInfo, FcSevereWarning, FcSevereError
+} FcConfigSeverity;
+
 static void
-FcConfigError (FcConfigParse *parse, char *fmt, ...)
+FcConfigMessage (FcConfigParse *parse, FcConfigSeverity severe, char *fmt, ...)
 {
+    char       *s = "unknown";
     va_list    args;
 
     va_start (args, fmt);
+
+    switch (severe) {
+    case FcSevereInfo: s = "info"; break;
+    case FcSevereWarning: s = "warning"; break;
+    case FcSevereError: s = "error"; break;
+    }
     if (parse)
     {
        if (parse->name)
-           fprintf (stderr, "Fontconfig error: \"%s\", line %d: ",
+           fprintf (stderr, "Fontconfig %s: \"%s\", line %d: ", s,
                     parse->name, XML_GetCurrentLineNumber (parse->parser));
        else
-           fprintf (stderr, "Fontconfig error: line %d: ",
+           fprintf (stderr, "Fontconfig %s: line %d: ", s,
                     XML_GetCurrentLineNumber (parse->parser));
-       parse->error = FcTrue;
+       if (severe >= FcSevereError)
+           parse->error = FcTrue;
     }
     else
-       fprintf (stderr, "Fontconfig error: ");
+       fprintf (stderr, "Fontconfig %s: ", s);
     vfprintf (stderr, fmt, args);
     fprintf (stderr, "\n");
     va_end (args);
@@ -694,7 +712,7 @@ FcPStackPush (FcConfigParse *parse, FcElement element, const XML_Char **attr)
     {
        new->attr = FcConfigSaveAttr (attr);
        if (!new->attr)
-           FcConfigError (parse, "out of memory");
+           FcConfigMessage (parse, FcSevereError, "out of memory");
     }
     else
        new->attr = 0;
@@ -710,7 +728,7 @@ FcPStackPop (FcConfigParse *parse)
     
     if (!parse->pstack) 
     {
-       FcConfigError (parse, "mismatching element");
+       FcConfigMessage (parse, FcSevereError, "mismatching element");
        return FcFalse;
     }
     FcVStackClear (parse);
@@ -767,14 +785,11 @@ FcStartElement(void *userData, const XML_Char *name, const XML_Char **attr)
     
     element = FcElementMap (name);
     if (element == FcElementUnknown)
-    {
-       FcConfigError (parse, "unknown element \"%s\"", name);
-       return;
-    }
+       FcConfigMessage (parse, FcSevereWarning, "unknown element \"%s\"", name);
     
     if (!FcPStackPush (parse, element, attr))
     {
-       FcConfigError (parse, "out of memory");
+       FcConfigMessage (parse, FcSevereError, "out of memory");
        return;
     }
     return;
@@ -788,7 +803,7 @@ FcParseBlank (FcConfigParse *parse)
     {
        FcVStack    *v = FcVStackFetch (parse, n);
        if (v->tag != FcVStackInteger)
-           FcConfigError (parse, "non-integer blank");
+           FcConfigMessage (parse, FcSevereError, "non-integer blank");
        else
        {
            if (!parse->config->blanks)
@@ -796,19 +811,33 @@ FcParseBlank (FcConfigParse *parse)
                parse->config->blanks = FcBlanksCreate ();
                if (!parse->config->blanks)
                {
-                   FcConfigError (parse, "out of memory");
+                   FcConfigMessage (parse, FcSevereError, "out of memory");
                    break;
                }
            }
            if (!FcBlanksAdd (parse->config->blanks, v->u.integer))
            {
-               FcConfigError (parse, "out of memory");
+               FcConfigMessage (parse, FcSevereError, "out of memory");
                break;
            }
        }
     }
 }
 
+static void
+FcParseRescan (FcConfigParse *parse)
+{
+    int            n = FcVStackElements (parse);
+    while (n-- > 0)
+    {
+       FcVStack    *v = FcVStackFetch (parse, n);
+       if (v->tag != FcVStackInteger)
+           FcConfigMessage (parse, FcSevereWarning, "non-integer rescan");
+       else
+           parse->config->rescanInterval = v->u.integer;
+    }
+}
+
 static void
 FcParseInt (FcConfigParse *parse)
 {
@@ -820,13 +849,13 @@ FcParseInt (FcConfigParse *parse)
     s = FcStrBufDone (&parse->pstack->str);
     if (!s)
     {
-       FcConfigError (parse, "out of memory");
+       FcConfigMessage (parse, FcSevereError, "out of memory");
        return;
     }
     end = 0;
     l = (int) strtol ((char *) s, (char **)&end, 0);
     if (end != s + strlen ((char *) s))
-       FcConfigError (parse, "\"%s\": not a valid integer", s);
+       FcConfigMessage (parse, FcSevereError, "\"%s\": not a valid integer", s);
     else
        FcVStackPushInteger (parse, l);
     FcStrFree (s);
@@ -843,13 +872,13 @@ FcParseDouble (FcConfigParse *parse)
     s = FcStrBufDone (&parse->pstack->str);
     if (!s)
     {
-       FcConfigError (parse, "out of memory");
+       FcConfigMessage (parse, FcSevereError, "out of memory");
        return;
     }
     end = 0;
     d = strtod ((char *) s, (char **)&end);
     if (end != s + strlen ((char *) s))
-       FcConfigError (parse, "\"%s\": not a valid double", s);
+       FcConfigMessage (parse, FcSevereError, "\"%s\": not a valid double", s);
     else
        FcVStackPushDouble (parse, d);
     FcStrFree (s);
@@ -865,7 +894,7 @@ FcParseString (FcConfigParse *parse, FcVStackTag tag)
     s = FcStrBufDone (&parse->pstack->str);
     if (!s)
     {
-       FcConfigError (parse, "out of memory");
+       FcConfigMessage (parse, FcSevereError, "out of memory");
        return;
     }
     if (!FcVStackPushString (parse, tag, s))
@@ -881,23 +910,30 @@ FcParseMatrix (FcConfigParse *parse)
     
     while ((vstack = FcVStackPop (parse)))
     {
-       if (vstack->tag != FcVStackDouble)
-           FcConfigError (parse, "non-double matrix element");
-       else
-       {
-           double v = vstack->u._double;
-           switch (matrix_state) {
-           case m_xx: m.xx = v; break;
-           case m_xy: m.xy = v; break;
-           case m_yx: m.yx = v; break;
-           case m_yy: m.yy = v; break;
-           default: break;
-           }
-           matrix_state--;
+       double  v;
+       switch (vstack->tag) {
+       case FcVStackInteger:
+           v = vstack->u.integer;
+           break;
+       case FcVStackDouble:
+           v = vstack->u._double;
+           break;
+       default:
+           FcConfigMessage (parse, FcSevereError, "non-double matrix element");
+           v = 1.0;
+           break;
+       }
+       switch (matrix_state) {
+       case m_xx: m.xx = v; break;
+       case m_xy: m.xy = v; break;
+       case m_yx: m.yx = v; break;
+       case m_yy: m.yy = v; break;
+       default: break;
        }
+       matrix_state--;
     }
     if (matrix_state != m_done)
-       FcConfigError (parse, "wrong number of matrix elements");
+       FcConfigMessage (parse, FcSevereError, "wrong number of matrix elements");
     else
        FcVStackPushMatrix (parse, &m);
 }
@@ -924,7 +960,7 @@ FcParseBool (FcConfigParse *parse)
     s = FcStrBufDone (&parse->pstack->str);
     if (!s)
     {
-       FcConfigError (parse, "out of memory");
+       FcConfigMessage (parse, FcSevereError, "out of memory");
        return;
     }
     FcVStackPushBool (parse, FcConfigLexBool (s));
@@ -941,8 +977,9 @@ FcParseFamilies (FcConfigParse *parse, FcVStackTag tag)
     {
        if (vstack->tag != FcVStackFamily)
        {
-           FcConfigError (parse, "non-family");
-           break;
+           FcConfigMessage (parse, FcSevereWarning, "non-family");
+           FcVStackDestroy (vstack);
+           continue;
        }
        left = vstack->u.expr;
        vstack->tag = FcVStackNone;
@@ -952,7 +989,7 @@ FcParseFamilies (FcConfigParse *parse, FcVStackTag tag)
            new = FcExprCreateOp (left, FcOpComma, expr);
            if (!new)
            {
-               FcConfigError (parse, "out of memory");
+               FcConfigMessage (parse, FcSevereError, "out of memory");
                FcExprDestroy (left);
                FcExprDestroy (expr);
                break;
@@ -966,7 +1003,7 @@ FcParseFamilies (FcConfigParse *parse, FcVStackTag tag)
     {
        if (!FcVStackPushExpr (parse, tag, expr))
        {
-           FcConfigError (parse, "out of memory");
+           FcConfigMessage (parse, FcSevereError, "out of memory");
            if (expr)
                FcExprDestroy (expr);
        }
@@ -984,7 +1021,7 @@ FcParseFamily (FcConfigParse *parse)
     s = FcStrBufDone (&parse->pstack->str);
     if (!s)
     {
-       FcConfigError (parse, "out of memory");
+       FcConfigMessage (parse, FcSevereError, "out of memory");
        return;
     }
     expr = FcExprCreateString (s);
@@ -996,7 +1033,7 @@ FcParseFamily (FcConfigParse *parse)
 static void
 FcParseAlias (FcConfigParse *parse)
 {
-    FcExpr     *family = 0, *accept = 0, *prefer = 0, *def = 0;
+    FcExpr     *family = 0, *accept = 0, *prefer = 0, *def = 0, *new = 0;
     FcEdit     *edit = 0, *next;
     FcVStack   *vstack;
     FcTest     *test;
@@ -1006,9 +1043,20 @@ FcParseAlias (FcConfigParse *parse)
        switch (vstack->tag) {
        case FcVStackFamily:
            if (family)
-               FcExprDestroy (family);
-           family = vstack->u.expr;
-           vstack->tag = FcVStackNone;
+           {
+               new = FcExprCreateOp (vstack->u.expr, FcOpComma, family);
+               if (!new)
+                   FcConfigMessage (parse, FcSevereError, "out of memory");
+               else
+                   family = new;
+           }
+           else
+               new = vstack->u.expr;
+           if (new)
+           {
+               family = new;
+               vstack->tag = FcVStackNone;
+           }
            break;
        case FcVStackPrefer:
            if (prefer)
@@ -1029,14 +1077,20 @@ FcParseAlias (FcConfigParse *parse)
            vstack->tag = FcVStackNone;
            break;
        default:
-           FcConfigError (parse, "bad alias");
+           FcConfigMessage (parse, FcSevereWarning, "bad alias");
            break;
        }
        FcVStackDestroy (vstack);
     }
     if (!family)
     {
-       FcConfigError (parse, "missing family in alias");
+       FcConfigMessage (parse, FcSevereError, "missing family in alias");
+       if (prefer)
+           FcExprDestroy (prefer);
+       if (accept)
+           FcExprDestroy (accept);
+       if (def)
+           FcExprDestroy (def);
        return;
     }
     if (prefer)
@@ -1147,7 +1201,7 @@ FcPopExprs (FcConfigParse *parse, FcOp op)
            new = FcExprCreateOp (left, op, expr);
            if (!new)
            {
-               FcConfigError (parse, "out of memory");
+               FcConfigMessage (parse, FcSevereError, "out of memory");
                FcExprDestroy (left);
                FcExprDestroy (expr);
                break;
@@ -1178,7 +1232,7 @@ FcParseInclude (FcConfigParse *parse)
     s = FcStrBufDone (&parse->pstack->str);
     if (!s)
     {
-       FcConfigError (parse, "out of memory");
+       FcConfigMessage (parse, FcSevereError, "out of memory");
        return;
     }
     i = FcConfigGetAttribute (parse, "ignore_missing");
@@ -1245,15 +1299,15 @@ FcParseTest (FcConfigParse *parse)
            qual = FcQualAll;
        else
        {
-           FcConfigError (parse, "invalid test qual \"%s\"", qual_string);
-           return;
+           FcConfigMessage (parse, FcSevereWarning, "invalid test qual \"%s\"", qual_string);
+           qual = FcQualAny;
        }
     }
     name = FcConfigGetAttribute (parse, "name");
     if (!name)
     {
-       FcConfigError (parse, "missing test name");
-       return;
+       FcConfigMessage (parse, FcSevereWarning, "missing test name");
+       name = (FcChar8 *) FC_FAMILY;
     }
     compare_string = FcConfigGetAttribute (parse, "compare");
     if (!compare_string)
@@ -1263,20 +1317,20 @@ FcParseTest (FcConfigParse *parse)
        compare = FcConfigLexCompare (compare_string);
        if (compare == FcOpInvalid)
        {
-           FcConfigError (parse, "invalid test compare \"%s\"", compare_string);
-           return;
+           FcConfigMessage (parse, FcSevereWarning, "invalid test compare \"%s\"", compare_string);
+           compare = FcOpEqual;
        }
     }
-    expr = FcPopExpr (parse);
+    expr = FcPopExprs (parse, FcOpComma);
     if (!expr)
     {
-       FcConfigError (parse, "missing test expression");
+       FcConfigMessage (parse, FcSevereWarning, "missing test expression");
        return;
     }
     test = FcTestCreate (qual, name, compare, expr);
     if (!test)
     {
-       FcConfigError (parse, "out of memory");
+       FcConfigMessage (parse, FcSevereError, "out of memory");
        return;
     }
     FcVStackPushTest (parse, test);
@@ -1311,8 +1365,8 @@ FcParseEdit (FcConfigParse *parse)
     name = FcConfigGetAttribute (parse, "name");
     if (!name)
     {
-       FcConfigError (parse, "missing edit name");
-       return;
+       FcConfigMessage (parse, FcSevereWarning, "missing edit name");
+       name = (FcChar8 *) FC_FAMILY;
     }
     mode_string = FcConfigGetAttribute (parse, "mode");
     if (!mode_string)
@@ -1322,15 +1376,15 @@ FcParseEdit (FcConfigParse *parse)
        mode = FcConfigLexMode (mode_string);
        if (mode == FcOpInvalid)
        {
-           FcConfigError (parse, "invalid edit mode \"%s\"", mode_string);
-           return;
+           FcConfigMessage (parse, FcSevereWarning, "invalid edit mode \"%s\"", mode_string);
+           mode = FcOpAssign;
        }
     }
     expr = FcPopExprs (parse, FcOpComma);
     edit = FcEditCreate ((char *) FcStrCopy (name), mode, expr);
     if (!edit)
     {
-       FcConfigError (parse, "out of memory");
+       FcConfigMessage (parse, FcSevereError, "out of memory");
        FcExprDestroy (expr);
        return;
     }
@@ -1358,8 +1412,8 @@ FcParseMatch (FcConfigParse *parse)
            kind = FcMatchFont;
        else
        {
-           FcConfigError (parse, "invalid match target \"%s\"", kind_name);
-           return;
+           FcConfigMessage (parse, FcSevereWarning, "invalid match target \"%s\"", kind_name);
+           kind = FcMatchPattern;
        }
     }
     while ((vstack = FcVStackPop (parse)))
@@ -1376,13 +1430,13 @@ FcParseMatch (FcConfigParse *parse)
            vstack->tag = FcVStackNone;
            break;
        default:
-           FcConfigError (parse, "invalid match element");
+           FcConfigMessage (parse, FcSevereWarning, "invalid match element");
            break;
        }
        FcVStackDestroy (vstack);
     }
     if (!FcConfigAddEdit (parse->config, test, edit, kind))
-       FcConfigError (parse, "out of memory");
+       FcConfigMessage (parse, FcSevereError, "out of memory");
 }
 
 static void
@@ -1402,22 +1456,22 @@ FcEndElement(void *userData, const XML_Char *name)
        data = FcStrBufDone (&parse->pstack->str);
        if (!data)
        {
-           FcConfigError (parse, "out of memory");
+           FcConfigMessage (parse, FcSevereError, "out of memory");
            break;
        }
        if (!FcConfigAddDir (parse->config, data))
-           FcConfigError (parse, "out of memory");
+           FcConfigMessage (parse, FcSevereError, "out of memory");
        free (data);
        break;
     case FcElementCache:
        data = FcStrBufDone (&parse->pstack->str);
        if (!data)
        {
-           FcConfigError (parse, "out of memory");
+           FcConfigMessage (parse, FcSevereError, "out of memory");
            break;
        }
        if (!FcConfigSetCache (parse->config, data))
-           FcConfigError (parse, "out of memory");
+           FcConfigMessage (parse, FcSevereError, "out of memory");
        free (data);
        break;
     case FcElementInclude:
@@ -1435,6 +1489,9 @@ FcEndElement(void *userData, const XML_Char *name)
     case FcElementBlank:
        FcParseBlank (parse);
        break;
+    case FcElementRescan:
+       FcParseRescan (parse);
+       break;
        
     case FcElementPrefer:
        FcParseFamilies (parse, FcVStackPrefer);
@@ -1537,7 +1594,7 @@ FcCharacterData (void *userData, const XML_Char *s, int len)
     if (!parse->pstack)
        return;
     if (!FcStrBufData (&parse->pstack->str, (FcChar8 *) s, len))
-       FcConfigError (parse, "out of memory");
+       FcConfigMessage (parse, FcSevereError, "out of memory");
 }
 
 static void
@@ -1550,7 +1607,7 @@ FcStartDoctypeDecl (void      *userData,
     FcConfigParse   *parse = userData;
 
     if (strcmp ((char *) doctypeName, "fontconfig") != 0)
-       FcConfigError (parse, "invalid doctype \"%s\"", doctypeName);
+       FcConfigMessage (parse, FcSevereError, "invalid doctype \"%s\"", doctypeName);
 }
 
 static void
@@ -1597,18 +1654,18 @@ FcConfigParseAndLoad (FcConfig      *config,
        buf = XML_GetBuffer (p, BUFSIZ);
        if (!buf)
        {
-           FcConfigError (&parse, "cannot get parse buffer");
+           FcConfigMessage (&parse, FcSevereError, "cannot get parse buffer");
            goto bail3;
        }
        len = fread (buf, 1, BUFSIZ, f);
        if (len < 0)
        {
-           FcConfigError (&parse, "failed reading config file");
+           FcConfigMessage (&parse, FcSevereError, "failed reading config file");
            goto bail3;
        }
        if (!XML_ParseBuffer (p, len, len == 0))
        {
-           FcConfigError (&parse, "%s", 
+           FcConfigMessage (&parse, FcSevereError, "%s", 
                           XML_ErrorString (XML_GetErrorCode (p)));
            goto bail3;
        }
@@ -1624,9 +1681,9 @@ bail0:
     if (error && complain)
     {
        if (name)
-           FcConfigError (0, "Cannot load config file \"%s\"", name);
+           FcConfigMessage (0, FcSevereError, "Cannot load config file \"%s\"", name);
        else
-           FcConfigError (0, "Cannot load default config file");
+           FcConfigMessage (0, FcSevereError, "Cannot load default config file");
        return FcFalse;
     }
     return FcTrue;