From 272e57235cd60a2e65ac8258d96a02eb3939b687 Mon Sep 17 00:00:00 2001
From: marha <marha@users.sourceforge.net>
Date: Fri, 25 Mar 2011 10:41:05 +0000
Subject: git update until 25 Mar 2011

xserver
fontconfig
glproto
libXau
libXft
libXmu
libfontenc
libxcb
mesa
mkfontscale
pixman
randrproto
xkeyboard-config
xtrans
xwininfo

updated following packages:

xproto-7.0.21
xineramaproto-1.2.1
libXt-1.1.1
libxkbfile-1.0.7
libXpm-3.5.9
libXfont-1.4.3
libXaw-1.0.9
bdftopcf-1.0.3
encodings-1.0.4
fixesproto-5.0
font-adobe-100dpi-1.0.3
font-adobe-75dpi-1.0.3
font-adobe-utopia-100dpi-1.0.4
font-adobe-utopia-75dpi-1.0.4
font-adobe-utopia-type1-1.0.4
font-alias-1.0.3
font-arabic-misc-1.0.3
font-bh-100dpi-1.0.3
font-bh-75dpi-1.0.3
font-bh-lucidatypewriter-100dpi-1.0.3
font-bh-lucidatypewriter-75dpi-1.0.3
font-bh-ttf-1.0.3
font-bh-type1-1.0.3
font-bitstream-100dpi-1.0.3
font-bitstream-75dpi-1.0.3
font-bitstream-speedo-1.0.2
font-bitstream-type1-1.0.3
font-cronyx-cyrillic-1.0.3
font-cursor-misc-1.0.3
font-daewoo-misc-1.0.3
font-dec-misc-1.0.3
font-ibm-type1-1.0.3
font-isas-misc-1.0.3
font-jis-misc-1.0.3
font-micro-misc-1.0.3
font-misc-cyrillic-1.0.3
font-misc-ethiopic-1.0.3
font-misc-meltho-1.0.3
font-misc-misc-1.1.2
font-mutt-misc-1.0.3
font-schumacher-misc-1.1.2
font-screen-cyrillic-1.0.4
font-sony-misc-1.0.3
font-sun-misc-1.0.3
font-util-1.2.0
font-winitzki-cyrillic-1.0.3
font-xfree86-type1-1.0.4
---
 fontconfig/src/Makefile.am  |  14 +-
 fontconfig/src/fcarch.c     |  73 +++++++++
 fontconfig/src/fcarch.h     |  71 +++++++++
 fontconfig/src/fcatomic.c   |  10 +-
 fontconfig/src/fcblanks.c   |   4 +-
 fontconfig/src/fccache.c    |  86 +++++-----
 fontconfig/src/fccfg.c      | 167 ++++++++++++--------
 fontconfig/src/fccharset.c  | 171 +++++++++++---------
 fontconfig/src/fcdbg.c      |  26 ++--
 fontconfig/src/fcdefault.c  |   6 +-
 fontconfig/src/fcdir.c      |  22 +--
 fontconfig/src/fcformat.c   |  14 +-
 fontconfig/src/fcfreetype.c |  99 ++++++------
 fontconfig/src/fcfs.c       |  10 +-
 fontconfig/src/fcinit.c     |  12 +-
 fontconfig/src/fcint.h      |  68 ++++----
 fontconfig/src/fclang.c     |  96 ++++++++++--
 fontconfig/src/fclist.c     |  34 ++--
 fontconfig/src/fcmatch.c    |  38 ++---
 fontconfig/src/fcname.c     |  32 ++--
 fontconfig/src/fcpat.c      |  74 ++++-----
 fontconfig/src/fcstr.c      |  78 +++++-----
 fontconfig/src/fcxml.c      | 371 ++++++++++++++++++++++++++++++++++++--------
 23 files changed, 1060 insertions(+), 516 deletions(-)
 create mode 100644 fontconfig/src/fcarch.c
 create mode 100644 fontconfig/src/fcarch.h

(limited to 'fontconfig/src')

diff --git a/fontconfig/src/Makefile.am b/fontconfig/src/Makefile.am
index 406e85e15..090f9b1ab 100644
--- a/fontconfig/src/Makefile.am
+++ b/fontconfig/src/Makefile.am
@@ -7,9 +7,9 @@
 # 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
+# documentation, and that the name of the author(s) not be used in
 # advertising or publicity pertaining to distribution of the software without
-# specific, written prior permission.  Keith Packard makes no
+# specific, written prior permission.  The authors make no
 # representations about the suitability of this software for any purpose.  It
 # is provided "as is" without express or implied warranty.
 #
@@ -84,13 +84,12 @@ noinst_HEADERS=fcint.h fcftint.h fcdeprecate.h
 ALIAS_FILES = fcalias.h fcaliastail.h fcftalias.h fcftaliastail.h
 
 BUILT_SOURCES = $(ALIAS_FILES) \
-	../fc-arch/fcarch.h \
 	../fc-case/fccase.h \
 	../fc-glyphname/fcglyphname.h \
 	../fc-lang/fclang.h
 
-../fc-arch/fcarch.h:
-	cd ../fc-arch && $(MAKE) $(AM_MAKEFLAGS) fcarch.h
+noinst_PROGRAMS = fcarch
+
 ../fc-case/fccase.h:
 	cd ../fc-case && $(MAKE) $(AM_MAKEFLAGS) fccase.h
 ../fc-glyphname/fcglyphname.h:
@@ -99,6 +98,7 @@ BUILT_SOURCES = $(ALIAS_FILES) \
 	cd ../fc-lang && $(MAKE) $(AM_MAKEFLAGS) fclang.h
 
 libfontconfig_la_SOURCES = \
+	fcarch.h \
 	fcatomic.c \
 	fcblanks.c \
 	fccache.c \
@@ -140,7 +140,7 @@ PUBLIC_FILES = \
 	$(top_srcdir)/fontconfig/fontconfig.h \
 	$(top_srcdir)/src/fcdeprecate.h \
 	$(top_srcdir)/fontconfig/fcprivate.h
-	
+
 PUBLIC_FT_FILES = \
 	$(top_srcdir)/fontconfig/fcfreetype.h
 
@@ -160,7 +160,7 @@ fontconfig.def: $(PUBLIC_FILES) $(PUBLIC_FT_FILES)
 	echo Generating $@
 	(echo EXPORTS; \
 	(cat $(PUBLIC_FILES) $(PUBLIC_FT_FILES) || echo 'FcERROR ()' ) | \
- 	grep '^Fc[^ ]* *(' | sed -e 's/ *(.*$$//' -e 's/^/	/' | \
+	grep '^Fc[^ ]* *(' | sed -e 's/ *(.*$$//' -e 's/^/	/' | \
 	sort; \
 	echo LIBRARY libfontconfig-@LIBT_CURRENT_MINUS_AGE@.dll; \
 	echo VERSION @LIBT_CURRENT@.@LIBT_REVISION@) >$@
diff --git a/fontconfig/src/fcarch.c b/fontconfig/src/fcarch.c
new file mode 100644
index 000000000..c69397e18
--- /dev/null
+++ b/fontconfig/src/fcarch.c
@@ -0,0 +1,73 @@
+/*
+ * Copyright © 2002 Keith Packard
+ * Copyright © 2010 Behdad Esfahbod
+ *
+ * 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 the author(s) not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission.  The authors make no
+ * representations about the suitability of this software for any purpose.  It
+ * is provided "as is" without express or implied warranty.
+ *
+ * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE AUTHOR(S) 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.
+ */
+
+#include <stdio.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+/* If architecture is hardcoded, skip the assert tests */
+
+#ifndef FC_ARCHITECTURE
+
+#include "fcarch.h"
+
+/* Make sure the cache structure is consistent with what we expect */
+
+#include "fcint.h"
+
+FC_ASSERT_STATIC (1 == sizeof (char));
+FC_ASSERT_STATIC (2 == sizeof (FcChar16));
+FC_ASSERT_STATIC (4 == sizeof (int));
+FC_ASSERT_STATIC (4 == sizeof (FcChar32));
+FC_ASSERT_STATIC (4 == sizeof (FcObject));
+FC_ASSERT_STATIC (4 == sizeof (FcValueBinding));
+FC_ASSERT_STATIC (8 == sizeof (FcAlign));
+FC_ASSERT_STATIC (0x20 == sizeof (FcCharLeaf));
+
+FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (intptr_t));
+FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcPatternEltPtr));
+FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcValueListPtr));
+FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (char *));
+FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (struct FcPatternElt *));
+FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcValueList *));
+FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcStrSet *));
+FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcCharLeaf **));
+FC_ASSERT_STATIC (SIZEOF_VOID_P == sizeof (FcChar16 *));
+
+FC_ASSERT_STATIC (0x08 + 1*ALIGNOF_DOUBLE == sizeof (FcValue));
+FC_ASSERT_STATIC (0x00 + 2*SIZEOF_VOID_P == sizeof (FcPatternElt));
+FC_ASSERT_STATIC (0x08 + 2*SIZEOF_VOID_P == sizeof (FcPattern));
+FC_ASSERT_STATIC (0x08 + 2*SIZEOF_VOID_P == sizeof (FcCharSet));
+FC_ASSERT_STATIC (0x08 + 6*SIZEOF_VOID_P == sizeof (FcCache));
+
+#endif
+
+
+int
+main (int argc, char **argv)
+{
+    printf ("%s\n", FC_ARCHITECTURE);
+    return 0;
+}
diff --git a/fontconfig/src/fcarch.h b/fontconfig/src/fcarch.h
new file mode 100644
index 000000000..0c8cd053f
--- /dev/null
+++ b/fontconfig/src/fcarch.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright © 2006 Keith Packard
+ * Copyright © 2010 Behdad Esfahbod
+ *
+ * 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 the author(s) not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission.  The authors make no
+ * representations about the suitability of this software for any purpose.  It
+ * is provided "as is" without express or implied warranty.
+ *
+ * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE AUTHOR(S) 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.
+ */
+#ifndef _FCARCH_H_
+#define _FCARCH_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+/*
+ * Each unique machine architecture needs an entry in this file
+ * So far the differences boil down to: endianness, 32 vs 64 bit pointers,
+ * and on 32bit ones, whether double is aligned to one word or two words.
+ * Those result in the 6 formats listed below.
+ *
+ * If any of the assertion errors in fccache.c fail, you need to add a new
+ * architecture.  Contact the fontconfig mailing list in that case.
+ *
+ * name		endianness	pointer-size	double-alignment
+ *
+ * le32d4	4321		4		4
+ * le32d8	4321		4		8
+ * le64		4321		8		8
+ * be32d4	1234		4		4
+ * be32d8	1234		4		8
+ * be64		1234		8		8
+ */
+
+#if defined(WORDS_BIGENDIAN) && WORDS_BIGENDIAN
+# define FC_ARCH_ENDIAN "be"
+#else /* !WORDS_BIGENDIAN */
+# define FC_ARCH_ENDIAN "le"
+#endif
+
+#if SIZEOF_VOID_P == 4
+# if ALIGNOF_DOUBLE == 4
+#  define FC_ARCH_SIZE_ALIGN "32d4"
+# else /* ALIGNOF_DOUBLE != 4 */
+#  define FC_ARCH_SIZE_ALIGN "32d8"
+# endif
+#else /* SIZEOF_VOID_P != 4 */
+# define FC_ARCH_SIZE_ALIGN "64"
+#endif
+
+#ifdef ARCHITECTURE
+# define ARCHITECTURE FC_ARCHITECTURE
+#else
+# define FC_ARCHITECTURE FC_ARCH_ENDIAN FC_ARCH_SIZE_ALIGN
+#endif
+
+#endif /* _FCARCH_H_ */
diff --git a/fontconfig/src/fcatomic.c b/fontconfig/src/fcatomic.c
index 89cae6183..33c1cc628 100644
--- a/fontconfig/src/fcatomic.c
+++ b/fontconfig/src/fcatomic.c
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -79,7 +79,7 @@ FcAtomicCreate (const FcChar8   *file)
     if (!atomic)
 	return 0;
     FcMemAlloc (FC_MEM_ATOMIC, total_len);
-    
+
     atomic->file = (FcChar8 *) (atomic + 1);
     strcpy ((char *) atomic->file, (char *) file);
 
@@ -142,7 +142,7 @@ FcAtomicLock (FcAtomic *atomic)
 	 * machines sharing the same filesystem will have clocks
 	 * reasonably close to each other.
 	 */
-	if (FcStat ((char *) atomic->lck, &lck_stat) >= 0)
+	if (FcStat (atomic->lck, &lck_stat) >= 0)
 	{
 	    time_t  now = time (0);
 	    if ((long int) (now - lck_stat.st_mtime) > 10 * 60)
@@ -206,7 +206,7 @@ FcAtomicDestroy (FcAtomic *atomic)
 {
     FcMemFree (FC_MEM_ATOMIC, sizeof (FcAtomic) +
 	       strlen ((char *) atomic->file) * 4 + 4 +
-	       sizeof (NEW_NAME) + sizeof (LCK_NAME) + 
+	       sizeof (NEW_NAME) + sizeof (LCK_NAME) +
 	       sizeof (TMP_NAME));
 
     free (atomic);
diff --git a/fontconfig/src/fcblanks.c b/fontconfig/src/fcblanks.c
index bab3066e8..a80a1344f 100644
--- a/fontconfig/src/fcblanks.c
+++ b/fontconfig/src/fcblanks.c
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
diff --git a/fontconfig/src/fccache.c b/fontconfig/src/fccache.c
index 69e1a6b82..d86526623 100644
--- a/fontconfig/src/fccache.c
+++ b/fontconfig/src/fccache.c
@@ -6,9 +6,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -22,7 +22,7 @@
  */
 
 #include "fcint.h"
-#include "../fc-arch/fcarch.h"
+#include "fcarch.h"
 #include <stdio.h>
 #include <fcntl.h>
 #include <dirent.h>
@@ -41,6 +41,7 @@
 #define O_BINARY 0
 #endif
 
+
 struct MD5Context {
         FcChar32 buf[4];
         FcChar32 bits[2];
@@ -92,10 +93,10 @@ FcStat (const char *file, struct stat *statb)
     char full_path_name[MAX_PATH];
     char *basename;
     DWORD rc;
-    
+
     if (!GetFileAttributesEx (file, GetFileExInfoStandard, &wfad))
 	return -1;
-    
+
     statb->st_dev = 0;
 
     /* Calculate a pseudo inode number as a hash of the full path name.
@@ -108,7 +109,7 @@ FcStat (const char *file, struct stat *statb)
 
     rc = GetLongPathName (full_path_name, full_path_name, sizeof (full_path_name));
     statb->st_ino = FcStringHash (full_path_name);
-    
+
     statb->st_mode = _S_IREAD | _S_IWRITE;
     statb->st_mode |= (statb->st_mode >> 3) | (statb->st_mode >> 6);
 
@@ -116,21 +117,30 @@ FcStat (const char *file, struct stat *statb)
 	statb->st_mode |= _S_IFDIR;
     else
 	statb->st_mode |= _S_IFREG;
-    
+
     statb->st_nlink = 1;
     statb->st_uid = statb->st_gid = 0;
     statb->st_rdev = 0;
-    
+
     if (wfad.nFileSizeHigh > 0)
 	return -1;
     statb->st_size = wfad.nFileSizeLow;
-    
+
     statb->st_atime = (*(INT64 *)&wfad.ftLastAccessTime)/10000000 - EPOCH_OFFSET;
     statb->st_mtime = (*(INT64 *)&wfad.ftLastWriteTime)/10000000 - EPOCH_OFFSET;
     statb->st_ctime = statb->st_mtime;
-    
+
     return 0;
 }
+
+#else
+
+int
+FcStat (const char *file, struct stat *statb)
+{
+  return stat ((char *) file, statb);
+}
+
 #endif
 
 static const char bin2hex[] = { '0', '1', '2', '3',
@@ -215,13 +225,13 @@ FcDirCacheOpenFile (const FcChar8 *cache_file, struct stat *file_stat)
     return fd;
 }
 
-/* 
+/*
  * Look for a cache file for the specified dir. Attempt
  * to use each one we find, stopping when the callback
  * indicates success
  */
 static FcBool
-FcDirCacheProcess (FcConfig *config, const FcChar8 *dir, 
+FcDirCacheProcess (FcConfig *config, const FcChar8 *dir,
 		   FcBool (*callback) (int fd, struct stat *fd_stat,
 				       struct stat *dir_stat, void *closure),
 		   void *closure, FcChar8 **cache_file_ret)
@@ -233,7 +243,7 @@ FcDirCacheProcess (FcConfig *config, const FcChar8 *dir,
     struct stat file_stat, dir_stat;
     FcBool	ret = FcFalse;
 
-    if (FcStat ((char *) dir, &dir_stat) < 0)
+    if (FcStat (dir, &dir_stat) < 0)
         return FcFalse;
 
     FcDirCacheBasename (dir, cache_base);
@@ -263,7 +273,7 @@ FcDirCacheProcess (FcConfig *config, const FcChar8 *dir,
     	FcStrFree (cache_hashed);
     }
     FcStrListDone (list);
-    
+
     return ret;
 }
 
@@ -362,7 +372,7 @@ FcCacheInsert (FcCache *cache, struct stat *cache_stat)
 	update[fcCacheMaxLevel] = &fcCacheChains[fcCacheMaxLevel];
 	fcCacheMaxLevel = level;
     }
-    
+
     s = malloc (sizeof (FcCacheSkip) + (level - 1) * sizeof (FcCacheSkip *));
     if (!s)
 	return FcFalse;
@@ -382,7 +392,7 @@ FcCacheInsert (FcCache *cache, struct stat *cache_stat)
 	s->cache_ino = 0;
 	s->cache_mtime = 0;
     }
-    
+
     /*
      * Insert into all fcCacheChains
      */
@@ -515,7 +525,7 @@ FcCacheTimeValid (FcCache *cache, struct stat *dir_stat)
 
     if (!dir_stat)
     {
-	if (FcStat ((const char *) FcCacheDir (cache), &dir_static) < 0)
+	if (FcStat (FcCacheDir (cache), &dir_static) < 0)
 	    return FcFalse;
 	dir_stat = &dir_static;
     }
@@ -564,7 +574,7 @@ FcDirCacheMapFd (int fd, struct stat *fd_stat, struct stat *dir_stat)
 					 PAGE_READONLY, 0, 0, NULL);
 	    if (hFileMap != NULL)
 	    {
-		cache = MapViewOfFile (hFileMap, FILE_MAP_READ, 0, 0, 
+		cache = MapViewOfFile (hFileMap, FILE_MAP_READ, 0, 0,
 				       fd_stat->st_size);
 		CloseHandle (hFileMap);
 	    }
@@ -583,8 +593,8 @@ FcDirCacheMapFd (int fd, struct stat *fd_stat, struct stat *dir_stat)
 	    return NULL;
 	}
 	allocated = FcTrue;
-    } 
-    if (cache->magic != FC_CACHE_MAGIC_MMAP || 
+    }
+    if (cache->magic != FC_CACHE_MAGIC_MMAP ||
 	cache->version < FC_CACHE_CONTENT_VERSION ||
 	cache->size != fd_stat->st_size ||
 	!FcCacheTimeValid (cache, dir_stat) ||
@@ -674,7 +684,7 @@ FcDirCacheValidateHelper (int fd, struct stat *fd_stat, struct stat *dir_stat, v
 {
     FcBool  ret = FcTrue;
     FcCache	c;
-    
+
     if (read (fd, &c, sizeof (FcCache)) != sizeof (FcCache))
 	ret = FcFalse;
     else if (c.magic != FC_CACHE_MAGIC_MMAP)
@@ -691,7 +701,7 @@ FcDirCacheValidateHelper (int fd, struct stat *fd_stat, struct stat *dir_stat, v
 static FcBool
 FcDirCacheValidConfig (const FcChar8 *dir, FcConfig *config)
 {
-    return FcDirCacheProcess (config, dir, 
+    return FcDirCacheProcess (config, dir,
 			      FcDirCacheValidateHelper,
 			      NULL, NULL);
 }
@@ -700,7 +710,7 @@ FcBool
 FcDirCacheValid (const FcChar8 *dir)
 {
     FcConfig	*config;
-    
+
     config = FcConfigGetCurrent ();
     if (!config)
         return FcFalse;
@@ -722,7 +732,7 @@ FcDirCacheBuild (FcFontSet *set, const FcChar8 *dir, struct stat *dir_stat, FcSt
     FcChar8	*dir_serialize;
     intptr_t	*dirs_serialize;
     FcFontSet	*set_serialize;
-    
+
     if (!serialize)
 	return NULL;
     /*
@@ -747,7 +757,7 @@ FcDirCacheBuild (FcFontSet *set, const FcChar8 *dir, struct stat *dir_stat, FcSt
      */
     if (!FcFontSetSerializeAlloc (serialize, set))
 	goto bail1;
-    
+
     /* Serialize layout complete. Now allocate space and fill it */
     cache = malloc (serialize->size);
     if (!cache)
@@ -769,7 +779,7 @@ FcDirCacheBuild (FcFontSet *set, const FcChar8 *dir, struct stat *dir_stat, FcSt
     if (!dir_serialize)
 	goto bail2;
     cache->dir = FcPtrToOffset (cache, dir_serialize);
-    
+
     /*
      * Serialize sub dirs
      */
@@ -778,14 +788,14 @@ FcDirCacheBuild (FcFontSet *set, const FcChar8 *dir, struct stat *dir_stat, FcSt
 	goto bail2;
     cache->dirs = FcPtrToOffset (cache, dirs_serialize);
     cache->dirs_count = dirs->num;
-    for (i = 0; i < dirs->num; i++) 
+    for (i = 0; i < dirs->num; i++)
     {
 	FcChar8	*d_serialize = FcStrSerialize (serialize, dirs->strs[i]);
 	if (!d_serialize)
 	    goto bail2;
 	dirs_serialize[i] = FcPtrToOffset (dirs_serialize, d_serialize);
     }
-    
+
     /*
      * Serialize font set
      */
@@ -795,7 +805,7 @@ FcDirCacheBuild (FcFontSet *set, const FcChar8 *dir, struct stat *dir_stat, FcSt
     cache->set = FcPtrToOffset (cache, set_serialize);
 
     FcSerializeDestroy (serialize);
-    
+
     FcCacheInsert (cache, NULL);
 
     return cache;
@@ -817,10 +827,10 @@ FcMakeDirectory (const FcChar8 *dir)
 {
     FcChar8 *parent;
     FcBool  ret;
-    
+
     if (strlen ((char *) dir) == 0)
 	return FcFalse;
-    
+
     parent = FcStrDirname (dir);
     if (!parent)
 	return FcFalse;
@@ -854,7 +864,7 @@ FcDirCacheWrite (FcCache *cache, FcConfig *config)
     /*
      * Write it to the first directory in the list which is writable
      */
-    
+
     list = FcStrListCreate (config->cacheDirs);
     if (!list)
 	return FcFalse;
@@ -909,21 +919,21 @@ FcDirCacheWrite (FcCache *cache, FcConfig *config)
     fd = open((char *)FcAtomicNewFile (atomic), O_RDWR | O_CREAT | O_BINARY, 0666);
     if (fd == -1)
 	goto bail4;
-    
+
     /* Temporarily switch magic to MMAP while writing to file */
     magic = cache->magic;
     if (magic != FC_CACHE_MAGIC_MMAP)
 	cache->magic = FC_CACHE_MAGIC_MMAP;
-    
+
     /*
      * Write cache contents to file
      */
     written = write (fd, cache, cache->size);
-    
+
     /* Switch magic back */
     if (magic != FC_CACHE_MAGIC_MMAP)
 	cache->magic = magic;
-    
+
     if (written != cache->size)
     {
 	perror ("write cache");
@@ -982,7 +992,7 @@ FcCacheCopySet args1(const FcCache *c)
     FcFontSet	*old = FcCacheSet (c);
     FcFontSet	*new = FcFontSetCreate ();
     int		i;
-    
+
     if (!new)
 	return NULL;
     for (i = 0; i < old->nfont; i++)
@@ -1116,7 +1126,7 @@ static void MD5Update(struct MD5Context *ctx, const unsigned char *buf, unsigned
 }
 
 /*
- * Final wrapup - pad to 64-byte boundary with the bit pattern 
+ * Final wrapup - pad to 64-byte boundary with the bit pattern
  * 1 0* (64-bit count of bits processed, MSB-first)
  */
 static void MD5Final(unsigned char digest[16], struct MD5Context *ctx)
diff --git a/fontconfig/src/fccfg.c b/fontconfig/src/fccfg.c
index 0f89b57a4..4beb7d236 100644
--- a/fontconfig/src/fccfg.c
+++ b/fontconfig/src/fccfg.c
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -48,19 +48,19 @@ FcConfigCreate (void)
     if (!config)
 	goto bail0;
     FcMemAlloc (FC_MEM_CONFIG, sizeof (FcConfig));
-    
+
     config->configDirs = FcStrSetCreate ();
     if (!config->configDirs)
 	goto bail1;
-    
+
     config->configFiles = FcStrSetCreate ();
     if (!config->configFiles)
 	goto bail2;
-    
+
     config->fontDirs = FcStrSetCreate ();
     if (!config->fontDirs)
 	goto bail3;
-    
+
     config->acceptGlobs = FcStrSetCreate ();
     if (!config->acceptGlobs)
 	goto bail4;
@@ -72,7 +72,7 @@ FcConfigCreate (void)
     config->acceptPatterns = FcFontSetCreate ();
     if (!config->acceptPatterns)
 	goto bail6;
-    
+
     config->rejectPatterns = FcFontSetCreate ();
     if (!config->rejectPatterns)
 	goto bail7;
@@ -80,7 +80,7 @@ FcConfigCreate (void)
     config->cacheDirs = FcStrSetCreate ();
     if (!config->cacheDirs)
 	goto bail8;
-    
+
     config->blanks = 0;
 
     config->substPattern = 0;
@@ -91,12 +91,12 @@ FcConfigCreate (void)
 	config->fonts[set] = 0;
 
     config->rescanTime = time(0);
-    config->rescanInterval = 30;    
+    config->rescanInterval = 30;
 
     config->expr_pool = NULL;
 
     config->ref = 1;
-    
+
     return config;
 
 bail8:
@@ -131,7 +131,7 @@ FcConfigNewestFile (FcStrSet *files)
     if (list)
     {
 	while ((file = FcStrListNext (list)))
-	    if (FcStat ((char *) file, &statb) == 0)
+	    if (FcStat (file, &statb) == 0)
 		if (!newest.set || statb.st_mtime - newest.time > 0)
 		{
 		    newest.set = FcTrue;
@@ -181,7 +181,7 @@ static void
 FcSubstDestroy (FcSubst *s)
 {
     FcSubst *n;
-    
+
     while (s)
     {
 	n = s->next;
@@ -279,7 +279,7 @@ FcConfigDestroy (FcConfig *config)
  */
 
 FcBool
-FcConfigAddCache (FcConfig *config, FcCache *cache, 
+FcConfigAddCache (FcConfig *config, FcCache *cache,
 		  FcSetName set, FcStrSet *dirSet)
 {
     FcFontSet	*fs;
@@ -343,7 +343,7 @@ FcConfigAddDirList (FcConfig *config, FcSetName set, FcStrSet *dirSet)
     FcStrList	    *dirlist;
     FcChar8	    *dir;
     FcCache	    *cache;
-    
+
     dirlist = FcStrListCreate (dirSet);
     if (!dirlist)
         return FcFalse;
@@ -382,9 +382,9 @@ FcConfigBuildFonts (FcConfig *config)
     fonts = FcFontSetCreate ();
     if (!fonts)
 	return FcFalse;
-    
+
     FcConfigSetFonts (config, fonts, FcSetSystem);
-    
+
     if (!FcConfigAddDirList (config, FcSetSystem, config->fontDirs))
 	return FcFalse;
     if (FcDebug () & FC_DBG_FONTSET)
@@ -447,7 +447,7 @@ FcBool
 FcConfigAddDir (FcConfig	    *config,
 		const FcChar8	    *d)
 {
-    return (FcConfigAddConfigDir (config, d) && 
+    return (FcConfigAddConfigDir (config, d) &&
 	    FcConfigAddFontDir (config, d));
 }
 
@@ -481,17 +481,17 @@ FcConfigGetCacheDirs (FcConfig	*config)
     }
     return FcStrListCreate (config->cacheDirs);
 }
-    
+
 FcBool
 FcConfigAddConfigFile (FcConfig	    *config,
 		       const FcChar8   *f)
 {
     FcBool	ret;
     FcChar8	*file = FcConfigFilename (f);
-    
+
     if (!file)
 	return FcFalse;
-    
+
     ret = FcStrSetAdd (config->configFiles, file);
     FcStrFree (file);
     return ret;
@@ -555,7 +555,7 @@ FcConfigAddBlank (FcConfig	*config,
 		  FcChar32    	blank)
 {
     FcBlanks	*b, *freeme = 0;
-    
+
     b = config->blanks;
     if (!b)
     {
@@ -613,7 +613,7 @@ FcConfigSetRescanInverval (FcConfig *config, int rescanInterval)
     return FcConfigSetRescanInterval (config, rescanInterval);
 }
 
-    
+
 FcBool
 FcConfigAddEdit (FcConfig	*config,
 		 FcTest		*test,
@@ -697,10 +697,10 @@ FcConfigCompareValue (const FcValue	*left_o,
     FcValue	left = FcValueCanonicalize(left_o);
     FcValue	right = FcValueCanonicalize(right_o);
     FcBool	ret = FcFalse;
-    
+
     left = FcConfigPromote (left, right);
     right = FcConfigPromote (right, left);
-    if (left.type == right.type) 
+    if (left.type == right.type)
     {
 	switch (left.type) {
 	case FcTypeInteger:
@@ -716,16 +716,16 @@ FcConfigCompareValue (const FcValue	*left_o,
 	    case FcOpNotContains:
 		ret = left.u.d != right.u.d;
 		break;
-	    case FcOpLess:    
+	    case FcOpLess:
 		ret = left.u.d < right.u.d;
 		break;
-	    case FcOpLessEqual:    
+	    case FcOpLessEqual:
 		ret = left.u.d <= right.u.d;
 		break;
-	    case FcOpMore:    
+	    case FcOpMore:
 		ret = left.u.d > right.u.d;
 		break;
-	    case FcOpMoreEqual:    
+	    case FcOpMoreEqual:
 		ret = left.u.d >= right.u.d;
 		break;
 	    default:
@@ -734,7 +734,7 @@ FcConfigCompareValue (const FcValue	*left_o,
 	    break;
 	case FcTypeBool:
 	    switch (op) {
-	    case FcOpEqual:    
+	    case FcOpEqual:
 	    case FcOpContains:
 	    case FcOpListing:
 		ret = left.u.b == right.u.b;
@@ -749,7 +749,7 @@ FcConfigCompareValue (const FcValue	*left_o,
 	    break;
 	case FcTypeString:
 	    switch (op) {
-	    case FcOpEqual:    
+	    case FcOpEqual:
 	    case FcOpListing:
 		ret = FcStrCmpIgnoreCase (left.u.s, right.u.s) == 0;
 		break;
@@ -872,7 +872,7 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e)
     FcResult	r;
     FcMatrix	*m;
     FcChar8     *str;
-    
+
     switch (e->op) {
     case FcOpInteger:
 	v.type = FcTypeInteger;
@@ -897,6 +897,11 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e)
 	v.u.c = e->u.cval;
 	v = FcValueSave (v);
 	break;
+    case FcOpLangSet:
+	v.type = FcTypeLangSet;
+	v.u.l = e->u.lval;
+	v = FcValueSave (v);
+	break;
     case FcOpBool:
 	v.type = FcTypeBool;
 	v.u.b = e->u.bval;
@@ -957,24 +962,24 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e)
 	    switch (vl.type) {
 	    case FcTypeDouble:
 		switch (e->op) {
-		case FcOpPlus:	   
+		case FcOpPlus:	
 		    v.type = FcTypeDouble;
-		    v.u.d = vl.u.d + vr.u.d; 
+		    v.u.d = vl.u.d + vr.u.d;
 		    break;
 		case FcOpMinus:
 		    v.type = FcTypeDouble;
-		    v.u.d = vl.u.d - vr.u.d; 
+		    v.u.d = vl.u.d - vr.u.d;
 		    break;
 		case FcOpTimes:
 		    v.type = FcTypeDouble;
-		    v.u.d = vl.u.d * vr.u.d; 
+		    v.u.d = vl.u.d * vr.u.d;
 		    break;
 		case FcOpDivide:
 		    v.type = FcTypeDouble;
-		    v.u.d = vl.u.d / vr.u.d; 
+		    v.u.d = vl.u.d / vr.u.d;
 		    break;
 		default:
-		    v.type = FcTypeVoid; 
+		    v.type = FcTypeVoid;
 		    break;
 		}
 		if (v.type == FcTypeDouble &&
@@ -995,7 +1000,7 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e)
 		    v.u.b = vl.u.b && vr.u.b;
 		    break;
 		default:
-		    v.type = FcTypeVoid; 
+		    v.type = FcTypeVoid;
 		    break;
 		}
 		break;
@@ -1006,7 +1011,7 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e)
 		    str = FcStrPlus (vl.u.s, vr.u.s);
 		    v.u.s = FcStrStaticName (str);
 		    FcStrFree (str);
-			 
+			
 		    if (!v.u.s)
 			v.type = FcTypeVoid;
 		    break;
@@ -1036,6 +1041,44 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e)
 		    break;
 		}
 		break;
+	    case FcTypeCharSet:
+		switch (e->op) {
+		case FcOpPlus:
+		    v.type = FcTypeCharSet;
+		    v.u.c = FcCharSetUnion (vl.u.c, vr.u.c);
+		    if (!v.u.c)
+			v.type = FcTypeVoid;
+		    break;
+		case FcOpMinus:
+		    v.type = FcTypeCharSet;
+		    v.u.c = FcCharSetSubtract (vl.u.c, vr.u.c);
+		    if (!v.u.c)
+			v.type = FcTypeVoid;
+		    break;
+		default:
+		    v.type = FcTypeVoid;
+		    break;
+		}
+		break;
+	    case FcTypeLangSet:
+		switch (e->op) {
+		case FcOpPlus:
+		    v.type = FcTypeLangSet;
+		    v.u.l = FcLangSetUnion (vl.u.l, vr.u.l);
+		    if (!v.u.l)
+			v.type = FcTypeVoid;
+		    break;
+		case FcOpMinus:
+		    v.type = FcTypeLangSet;
+		    v.u.l = FcLangSetSubtract (vl.u.l, vr.u.l);
+		    if (!v.u.l)
+			v.type = FcTypeVoid;
+		    break;
+		default:
+		    v.type = FcTypeVoid;
+		    break;
+		}
+		break;
 	    default:
 		v.type = FcTypeVoid;
 		break;
@@ -1139,7 +1182,7 @@ FcConfigMatchValueList (FcPattern	*p,
     FcExpr	    *e = t->expr;
     FcValue	    value;
     FcValueList	    *v;
-    
+
     while (e)
     {
 	/* Compute the value of the match expression */
@@ -1180,7 +1223,7 @@ static FcValueList *
 FcConfigValues (FcPattern *p, FcExpr *e, FcValueBinding binding)
 {
     FcValueList	*l;
-    
+
     if (!e)
 	return 0;
     l = (FcValueList *) malloc (sizeof (FcValueList));
@@ -1218,7 +1261,7 @@ FcConfigAdd (FcValueListPtr *head,
 {
     FcValueListPtr  *prev, last, v;
     FcValueBinding  sameBinding;
-    
+
     if (position)
 	sameBinding = position->binding;
     else
@@ -1231,7 +1274,7 @@ FcConfigAdd (FcValueListPtr *head,
 	if (position)
 	    prev = &position->next;
 	else
-	    for (prev = head; *prev != NULL; 
+	    for (prev = head; *prev != NULL;
 		 prev = &(*prev)->next)
 		;
     }
@@ -1239,7 +1282,7 @@ FcConfigAdd (FcValueListPtr *head,
     {
 	if (position)
 	{
-	    for (prev = head; *prev != NULL; 
+	    for (prev = head; *prev != NULL;
 		 prev = &(*prev)->next)
 	    {
 		if (*prev == position)
@@ -1262,24 +1305,24 @@ FcConfigAdd (FcValueListPtr *head,
 	FcValueListPrint (*head);
 	printf ("\n");
     }
-    
+
     if (new)
     {
 	last = new;
 	while (last->next != NULL)
 	    last = last->next;
-    
+
 	last->next = *prev;
 	*prev = new;
     }
-    
+
     if (FcDebug () & FC_DBG_EDIT)
     {
 	printf ("%s list after ", append ? "Append" : "Prepend");
 	FcValueListPrint (*head);
 	printf ("\n");
     }
-    
+
     return FcTrue;
 }
 
@@ -1310,7 +1353,7 @@ FcConfigPatternAdd (FcPattern	*p,
     if (list)
     {
 	FcPatternElt    *e = FcPatternObjectInsertElt (p, object);
-    
+
 	if (!e)
 	    return;
 	FcConfigAdd (&e->values, 0, append, list);
@@ -1462,7 +1505,7 @@ FcConfigSubstituteWithPat (FcConfig    *config,
 		if ((t->kind == FcMatchFont || kind == FcMatchPattern) &&
 		    t->object == e->object)
 		{
-		    /* 
+		    /*
 		     * KLUDGE - the pattern may have been reallocated or
 		     * things may have been inserted or deleted above
 		     * this element by other edits.  Go back and find
@@ -1485,7 +1528,7 @@ FcConfigSubstituteWithPat (FcConfig    *config,
 		{
 		    FcValueList	*thisValue = st[i].value;
 		    FcValueList	*nextValue = thisValue;
-		    
+		
 		    /*
 		     * Append the new list of values after the current value
 		     */
@@ -1624,7 +1667,7 @@ DllMain (HINSTANCE hinstDLL,
       }
       else
           fontconfig_path[0] = '\0';
-      
+
       break;
   }
 
@@ -1671,7 +1714,7 @@ FcConfigFileExists (const FcChar8 *dir, const FcChar8 *file)
     FcMemAlloc (FC_MEM_STRING, strlen ((char *) path) + 1);
     if (access ((char *) path, R_OK) == 0)
 	return path;
-    
+
     FcStrFree (path);
     return 0;
 }
@@ -1703,7 +1746,7 @@ FcConfigGetPath (void)
     if (env)
     {
 	e = env;
-	while (*e) 
+	while (*e)
 	{
 	    colon = (FcChar8 *) strchr ((char *) e, FC_SEARCH_PATH_SEPARATOR);
 	    if (!colon)
@@ -1720,7 +1763,7 @@ FcConfigGetPath (void)
 	    i++;
 	}
     }
-    
+
 #ifdef _WIN32
 	if (fontconfig_path[0] == '\0')
 	{
@@ -1858,7 +1901,7 @@ FcConfigAppFontAddFile (FcConfig    *config,
     subdirs = FcStrSetCreate ();
     if (!subdirs)
 	return FcFalse;
-    
+
     set = FcConfigGetFonts (config, FcSetApplication);
     if (!set)
     {
@@ -1894,7 +1937,7 @@ FcConfigAppFontAddDir (FcConfig	    *config,
 {
     FcFontSet	*set;
     FcStrSet	*dirs;
-    
+
     if (!config)
     {
 	config = FcConfigGetCurrent ();
@@ -1905,7 +1948,7 @@ FcConfigAppFontAddDir (FcConfig	    *config,
     dirs = FcStrSetCreate ();
     if (!dirs)
 	return FcFalse;
-    
+
     set = FcConfigGetFonts (config, FcSetApplication);
     if (!set)
     {
@@ -1917,9 +1960,9 @@ FcConfigAppFontAddDir (FcConfig	    *config,
 	}
 	FcConfigSetFonts (config, set, FcSetApplication);
     }
-    
+
     FcStrSetAddFilename (dirs, dir);
-    
+
     if (!FcConfigAddDirList (config, FcSetApplication, dirs))
     {
 	FcStrSetDestroy (dirs);
@@ -1962,7 +2005,7 @@ FcConfigGlobMatch (const FcChar8    *glob,
 {
     FcChar8	c;
 
-    while ((c = *glob++)) 
+    while ((c = *glob++))
     {
 	switch (c) {
 	case '*':
@@ -2034,7 +2077,7 @@ FcConfigPatternsMatch (const FcFontSet	*patterns,
 		       const FcPattern	*font)
 {
     int i;
-    
+
     for (i = 0; i < patterns->nfont; i++)
 	if (FcListPatternMatchAny (patterns->fonts[i], font))
 	    return FcTrue;
diff --git a/fontconfig/src/fccharset.c b/fontconfig/src/fccharset.c
index d30e1614a..df1d2b538 100644
--- a/fontconfig/src/fccharset.c
+++ b/fontconfig/src/fccharset.c
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -53,7 +53,7 @@ void
 FcCharSetDestroy (FcCharSet *fcs)
 {
     int i;
-    
+
     if (fcs->ref == FC_REF_CONSTANT)
     {
 	FcCacheObjectDereference (fcs);
@@ -135,9 +135,9 @@ FcCharSetFindLeaf (const FcCharSet *fcs, FcChar32 ucs4)
 #define FC_IS_ZERO_OR_POWER_OF_TWO(x) (!((x) & ((x)-1)))
 
 static FcBool
-FcCharSetPutLeaf (FcCharSet	*fcs, 
+FcCharSetPutLeaf (FcCharSet	*fcs,
 		  FcChar32	ucs4,
-		  FcCharLeaf	*leaf, 
+		  FcCharLeaf	*leaf,
 		  int		pos)
 {
     intptr_t	*leaves = FcCharSetLeaves (fcs);
@@ -188,8 +188,8 @@ FcCharSetPutLeaf (FcCharSet	*fcs,
       fcs->leaves_offset = FcPtrToOffset (fcs, leaves);
       fcs->numbers_offset = FcPtrToOffset (fcs, numbers);
     }
-    
-    memmove (leaves + pos + 1, leaves + pos, 
+
+    memmove (leaves + pos + 1, leaves + pos,
 	     (fcs->num - pos) * sizeof (*leaves));
     memmove (numbers + pos + 1, numbers + pos,
 	     (fcs->num - pos) * sizeof (*numbers));
@@ -213,11 +213,11 @@ FcCharSetFindLeafCreate (FcCharSet *fcs, FcChar32 ucs4)
     pos = FcCharSetFindLeafPos (fcs, ucs4);
     if (pos >= 0)
 	return FcCharSetLeaf(fcs, pos);
-    
+
     leaf = calloc (1, sizeof (FcCharLeaf));
     if (!leaf)
 	return 0;
-    
+
     pos = -pos - 1;
     if (!FcCharSetPutLeaf (fcs, ucs4, leaf, pos))
     {
@@ -251,7 +251,7 @@ FcCharSetAddChar (FcCharSet *fcs, FcChar32 ucs4)
 {
     FcCharLeaf	*leaf;
     FcChar32	*b;
-    
+
     if (fcs->ref == FC_REF_CONSTANT)
 	return FcFalse;
     leaf = FcCharSetFindLeafCreate (fcs, ucs4);
@@ -262,6 +262,23 @@ FcCharSetAddChar (FcCharSet *fcs, FcChar32 ucs4)
     return FcTrue;
 }
 
+FcBool
+FcCharSetDelChar (FcCharSet *fcs, FcChar32 ucs4)
+{
+    FcCharLeaf	*leaf;
+    FcChar32	*b;
+
+    if (fcs->ref == FC_REF_CONSTANT)
+	return FcFalse;
+    leaf = FcCharSetFindLeaf (fcs, ucs4);
+    if (!leaf)
+	return FcTrue;
+    b = &leaf->map[(ucs4 & 0xff) >> 5];
+    *b &= ~(1 << (ucs4 & 0x1f));
+    /* We don't bother removing the leaf if it's empty */
+    return FcTrue;
+}
+
 /*
  * An iterator for the leaves of a charset
  */
@@ -337,7 +354,7 @@ FcCharSetEqual (const FcCharSet *a, const FcCharSet *b)
 {
     FcCharSetIter   ai, bi;
     int		    i;
-    
+
     if (a == b)
 	return FcTrue;
     for (FcCharSetIterStart (a, &ai), FcCharSetIterStart (b, &bi);
@@ -568,7 +585,7 @@ FcCharSetIntersectCount (const FcCharSet *a, const FcCharSet *b)
 {
     FcCharSetIter   ai, bi;
     FcChar32	    count = 0;
-    
+
     FcCharSetIterStart (a, &ai);
     FcCharSetIterStart (b, &bi);
     while (ai.leaf && bi.leaf)
@@ -581,7 +598,7 @@ FcCharSetIntersectCount (const FcCharSet *a, const FcCharSet *b)
 	    while (i--)
 		count += FcCharSetPopCount (*am++ & *bm++);
 	    FcCharSetIterNext (a, &ai);
-	} 
+	}
 	else if (ai.ucs4 < bi.ucs4)
 	{
 	    ai.ucs4 = bi.ucs4;
@@ -601,7 +618,7 @@ FcCharSetCount (const FcCharSet *a)
 {
     FcCharSetIter   ai;
     FcChar32	    count = 0;
-    
+
     for (FcCharSetIterStart (a, &ai); ai.leaf; FcCharSetIterNext (a, &ai))
     {
 	int		    i = 256/32;
@@ -618,7 +635,7 @@ FcCharSetSubtractCount (const FcCharSet *a, const FcCharSet *b)
 {
     FcCharSetIter   ai, bi;
     FcChar32	    count = 0;
-    
+
     FcCharSetIterStart (a, &ai);
     FcCharSetIterStart (b, &bi);
     while (ai.leaf)
@@ -657,7 +674,7 @@ FcCharSetIsSubset (const FcCharSet *a, const FcCharSet *b)
 {
     int		ai, bi;
     FcChar16	an, bn;
-    
+
     if (a == b) return FcTrue;
     bi = 0;
     ai = 0;
@@ -672,7 +689,7 @@ FcCharSetIsSubset (const FcCharSet *a, const FcCharSet *b)
 	{
 	    FcChar32	*am = FcCharSetLeaf(a, ai)->map;
 	    FcChar32	*bm = FcCharSetLeaf(b, bi)->map;
-	    
+	
 	    if (am != bm)
 	    {
 		int	i = 256/32;
@@ -710,7 +727,7 @@ FcCharSetIsSubset (const FcCharSet *a, const FcCharSet *b)
  */
 
 FcChar32
-FcCharSetNextPage (const FcCharSet  *a, 
+FcCharSetNextPage (const FcCharSet  *a,
 		   FcChar32	    map[FC_CHARSET_MAP_SIZE],
 		   FcChar32	    *next)
 {
@@ -721,7 +738,7 @@ FcCharSetNextPage (const FcCharSet  *a,
     FcCharSetIterSet (a, &ai);
     if (!ai.leaf)
 	return FC_CHARSET_DONE;
-    
+
     /*
      * Save current information
      */
@@ -737,7 +754,7 @@ FcCharSetNextPage (const FcCharSet  *a,
 }
 
 FcChar32
-FcCharSetFirstPage (const FcCharSet *a, 
+FcCharSetFirstPage (const FcCharSet *a,
 		    FcChar32	    map[FC_CHARSET_MAP_SIZE],
 		    FcChar32	    *next)
 {
@@ -748,7 +765,7 @@ FcCharSetFirstPage (const FcCharSet *a,
 /*
  * old coverage API, rather hard to use correctly
  */
-    
+
 FcChar32
 FcCharSetCoverage (const FcCharSet *a, FcChar32 page, FcChar32 *result)
 {
@@ -772,7 +789,7 @@ FcCharSetCoverage (const FcCharSet *a, FcChar32 page, FcChar32 *result)
 
 /*
  * ASCII representation of charsets.
- * 
+ *
  * Each leaf is represented as 9 32-bit values, the code of the first character followed
  * by 8 32 bit values for the leaf itself.  Each value is encoded as 5 ASCII characters,
  * only 85 different values are used to avoid control characters as well as the other
@@ -781,38 +798,38 @@ FcCharSetCoverage (const FcCharSet *a, FcChar32 page, FcChar32 *result)
  */
 
 static const unsigned char	charToValue[256] = {
-    /*     "" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /*   "\b" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /* "\020" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /* "\030" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /*    " " */ 0xff,  0x00,  0xff,  0x01,  0x02,  0x03,  0x04,  0xff, 
-    /*    "(" */ 0x05,  0x06,  0x07,  0x08,  0xff,  0xff,  0x09,  0x0a, 
-    /*    "0" */ 0x0b,  0x0c,  0x0d,  0x0e,  0x0f,  0x10,  0x11,  0x12, 
-    /*    "8" */ 0x13,  0x14,  0xff,  0x15,  0x16,  0xff,  0x17,  0x18, 
-    /*    "@" */ 0x19,  0x1a,  0x1b,  0x1c,  0x1d,  0x1e,  0x1f,  0x20, 
-    /*    "H" */ 0x21,  0x22,  0x23,  0x24,  0x25,  0x26,  0x27,  0x28, 
-    /*    "P" */ 0x29,  0x2a,  0x2b,  0x2c,  0x2d,  0x2e,  0x2f,  0x30, 
-    /*    "X" */ 0x31,  0x32,  0x33,  0x34,  0xff,  0x35,  0x36,  0xff, 
-    /*    "`" */ 0xff,  0x37,  0x38,  0x39,  0x3a,  0x3b,  0x3c,  0x3d, 
-    /*    "h" */ 0x3e,  0x3f,  0x40,  0x41,  0x42,  0x43,  0x44,  0x45, 
-    /*    "p" */ 0x46,  0x47,  0x48,  0x49,  0x4a,  0x4b,  0x4c,  0x4d, 
-    /*    "x" */ 0x4e,  0x4f,  0x50,  0x51,  0x52,  0x53,  0x54,  0xff, 
-    /* "\200" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /* "\210" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /* "\220" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /* "\230" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /* "\240" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /* "\250" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /* "\260" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /* "\270" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /* "\300" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /* "\310" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /* "\320" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /* "\330" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /* "\340" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /* "\350" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /* "\360" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
-    /* "\370" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff, 
+    /*     "" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /*   "\b" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /* "\020" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /* "\030" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /*    " " */ 0xff,  0x00,  0xff,  0x01,  0x02,  0x03,  0x04,  0xff,
+    /*    "(" */ 0x05,  0x06,  0x07,  0x08,  0xff,  0xff,  0x09,  0x0a,
+    /*    "0" */ 0x0b,  0x0c,  0x0d,  0x0e,  0x0f,  0x10,  0x11,  0x12,
+    /*    "8" */ 0x13,  0x14,  0xff,  0x15,  0x16,  0xff,  0x17,  0x18,
+    /*    "@" */ 0x19,  0x1a,  0x1b,  0x1c,  0x1d,  0x1e,  0x1f,  0x20,
+    /*    "H" */ 0x21,  0x22,  0x23,  0x24,  0x25,  0x26,  0x27,  0x28,
+    /*    "P" */ 0x29,  0x2a,  0x2b,  0x2c,  0x2d,  0x2e,  0x2f,  0x30,
+    /*    "X" */ 0x31,  0x32,  0x33,  0x34,  0xff,  0x35,  0x36,  0xff,
+    /*    "`" */ 0xff,  0x37,  0x38,  0x39,  0x3a,  0x3b,  0x3c,  0x3d,
+    /*    "h" */ 0x3e,  0x3f,  0x40,  0x41,  0x42,  0x43,  0x44,  0x45,
+    /*    "p" */ 0x46,  0x47,  0x48,  0x49,  0x4a,  0x4b,  0x4c,  0x4d,
+    /*    "x" */ 0x4e,  0x4f,  0x50,  0x51,  0x52,  0x53,  0x54,  0xff,
+    /* "\200" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /* "\210" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /* "\220" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /* "\230" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /* "\240" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /* "\250" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /* "\260" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /* "\270" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /* "\300" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /* "\310" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /* "\320" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /* "\330" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /* "\340" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /* "\350" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /* "\360" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
+    /* "\370" */ 0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,  0xff,
 };
 
 static const FcChar8 valueToChar[0x55] = {
@@ -835,7 +852,7 @@ FcCharSetParseValue (FcChar8 *string, FcChar32 *value)
     int		i;
     FcChar32	v;
     FcChar32	c;
-    
+
     if (*string == ' ')
     {
 	v = 0;
@@ -1006,7 +1023,7 @@ FcNameUnparseCharSet (FcStrBuf *buf, const FcCharSet *c)
 	FcCharSetDestroy (check);
     }
 #endif
-    
+
     return FcTrue;
 }
 
@@ -1093,7 +1110,7 @@ FcCharSetFreezeLeaf (FcCharSetFreezer *freezer, FcCharLeaf *leaf)
     FcChar32			hash = FcCharLeafHash (leaf);
     FcCharLeafEnt		**bucket = &freezer->leaf_hash_table[hash % FC_CHAR_LEAF_HASH_SIZE];
     FcCharLeafEnt		*ent;
-    
+
     for (ent = *bucket; ent; ent = ent->next)
     {
 	if (ent->hash == hash && !memcmp (&ent->leaf, leaf, sizeof (FcCharLeaf)))
@@ -1130,7 +1147,7 @@ FcCharSetFreezeOrig (FcCharSetFreezer *freezer, const FcCharSet *orig, const FcC
 {
     FcCharSetOrigEnt	**bucket = &freezer->orig_hash_table[((uintptr_t) orig) & FC_CHAR_SET_HASH_SIZE];
     FcCharSetOrigEnt	*ent;
-    
+
     ent = malloc (sizeof (FcCharSetOrigEnt));
     if (!ent)
 	return FcFalse;
@@ -1154,7 +1171,7 @@ FcCharSetFreezeBase (FcCharSetFreezer *freezer, FcCharSet *fcs, const FcCharSet
     {
 	if (ent->hash == hash &&
 	    ent->set.num == fcs->num &&
-	    !memcmp (FcCharSetNumbers(&ent->set), 
+	    !memcmp (FcCharSetNumbers(&ent->set),
 		     FcCharSetNumbers(fcs),
 		     fcs->num * sizeof (FcChar16)))
 	{
@@ -1176,9 +1193,9 @@ FcCharSetFreezeBase (FcCharSetFreezer *freezer, FcCharSet *fcs, const FcCharSet
     if (!ent)
 	return 0;
     FcMemAlloc (FC_MEM_CHARSET, size);
-    
+
     freezer->charsets_allocated++;
-    
+
     ent->set.ref = FC_REF_CONSTANT;
     ent->set.num = fcs->num;
     if (fcs->num)
@@ -1188,13 +1205,13 @@ FcCharSetFreezeBase (FcCharSetFreezer *freezer, FcCharSet *fcs, const FcCharSet
 	ent->set.leaves_offset = sizeof (ent->set);
 	ent->set.numbers_offset = (ent->set.leaves_offset +
 				   fcs->num * sizeof (intptr_t));
-    
+
 	ent_leaves = FcCharSetLeaves (&ent->set);
 	for (i = 0; i < fcs->num; i++)
 	    ent_leaves[i] = FcPtrToOffset (ent_leaves,
 					   FcCharSetLeaf (fcs, i));
-	memcpy (FcCharSetNumbers (&ent->set), 
-		FcCharSetNumbers (fcs), 
+	memcpy (FcCharSetNumbers (&ent->set),
+		FcCharSetNumbers (fcs),
 		fcs->num * sizeof (FcChar16));
     }
     else
@@ -1215,7 +1232,7 @@ FcCharSetFindFrozen (FcCharSetFreezer *freezer, const FcCharSet *orig)
 {
     FcCharSetOrigEnt    **bucket = &freezer->orig_hash_table[((uintptr_t) orig) & FC_CHAR_SET_HASH_SIZE];
     FcCharSetOrigEnt	*ent;
-    
+
     for (ent = *bucket; ent; ent = ent->next)
 	if (ent->orig == orig)
 	    return ent->frozen;
@@ -1325,7 +1342,7 @@ FcCharSetSerializeAlloc (FcSerialize *serialize, const FcCharSet *cs)
     intptr_t	    *leaves;
     FcChar16	    *numbers;
     int		    i;
-    
+
     if (cs->ref != FC_REF_CONSTANT)
     {
 	if (!serialize->cs_freezer)
@@ -1336,13 +1353,13 @@ FcCharSetSerializeAlloc (FcSerialize *serialize, const FcCharSet *cs)
 	}
 	if (FcCharSetFindFrozen (serialize->cs_freezer, cs))
 	    return FcTrue;
-    
+
         cs = FcCharSetFreeze (serialize->cs_freezer, cs);
     }
-    
+
     leaves = FcCharSetLeaves (cs);
     numbers = FcCharSetNumbers (cs);
-    
+
     if (!FcSerializeAlloc (serialize, cs, sizeof (FcCharSet)))
 	return FcFalse;
     if (!FcSerializeAlloc (serialize, leaves, cs->num * sizeof (intptr_t)))
@@ -1355,7 +1372,7 @@ FcCharSetSerializeAlloc (FcSerialize *serialize, const FcCharSet *cs)
 	    return FcFalse;
     return FcTrue;
 }
-    
+
 FcCharSet *
 FcCharSetSerialize(FcSerialize *serialize, const FcCharSet *cs)
 {
@@ -1371,11 +1388,11 @@ FcCharSetSerialize(FcSerialize *serialize, const FcCharSet *cs)
 	if (!cs)
 	    return NULL;
     }
-		    
+		
     cs_serialized = FcSerializePtr (serialize, cs);
     if (!cs_serialized)
 	return NULL;
-    
+
     cs_serialized->ref = FC_REF_CONSTANT;
     cs_serialized->num = cs->num;
 
@@ -1385,7 +1402,7 @@ FcCharSetSerialize(FcSerialize *serialize, const FcCharSet *cs)
 	leaves_serialized = FcSerializePtr (serialize, leaves);
 	if (!leaves_serialized)
 	    return NULL;
-    
+
 	cs_serialized->leaves_offset = FcPtrToOffset (cs_serialized,
 						      leaves_serialized);
 	
@@ -1393,10 +1410,10 @@ FcCharSetSerialize(FcSerialize *serialize, const FcCharSet *cs)
 	numbers_serialized = FcSerializePtr (serialize, numbers);
 	if (!numbers)
 	    return NULL;
-    
+
 	cs_serialized->numbers_offset = FcPtrToOffset (cs_serialized,
 						       numbers_serialized);
-    
+
 	for (i = 0; i < cs->num; i++)
 	{
 	    leaf = FcCharSetLeaf (cs, i);
@@ -1404,7 +1421,7 @@ FcCharSetSerialize(FcSerialize *serialize, const FcCharSet *cs)
 	    if (!leaf_serialized)
 		return NULL;
 	    *leaf_serialized = *leaf;
-	    leaves_serialized[i] = FcPtrToOffset (leaves_serialized, 
+	    leaves_serialized[i] = FcPtrToOffset (leaves_serialized,
 						  leaf_serialized);
 	    numbers_serialized[i] = numbers[i];
 	}
@@ -1414,7 +1431,7 @@ FcCharSetSerialize(FcSerialize *serialize, const FcCharSet *cs)
 	cs_serialized->leaves_offset = 0;
 	cs_serialized->numbers_offset = 0;
     }
-    
+
     return cs_serialized;
 }
 #define __fccharset__
diff --git a/fontconfig/src/fcdbg.c b/fontconfig/src/fcdbg.c
index fd2d55a6b..cf2ff0870 100644
--- a/fontconfig/src/fcdbg.c
+++ b/fontconfig/src/fcdbg.c
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -87,7 +87,7 @@ FcLangSetPrint (const FcLangSet *ls)
 {
     FcStrBuf	buf;
     FcChar8	init_buf[1024];
-    
+
     FcStrBufInit (&buf, init_buf, sizeof (init_buf));
     if (FcNameUnparseLangSet (&buf, ls) && FcStrBufChar (&buf,'\0'))
        printf ("%s", buf.buf);
@@ -102,16 +102,16 @@ FcCharSetPrint (const FcCharSet *c)
     int	i, j;
     intptr_t	*leaves = FcCharSetLeaves (c);
     FcChar16	*numbers = FcCharSetNumbers (c);
-    
+
 #if 0
     printf ("CharSet  0x%x\n", (intptr_t) c);
     printf ("Leaves:  +%d = 0x%x\n", c->leaves_offset, (intptr_t) leaves);
     printf ("Numbers: +%d = 0x%x\n", c->numbers_offset, (intptr_t) numbers);
-    
+
     for (i = 0; i < c->num; i++)
     {
-	printf ("Page %d: %04x +%d = 0x%x\n", 
-		i, numbers[i], leaves[i], 
+	printf ("Page %d: %04x +%d = 0x%x\n",
+		i, numbers[i], leaves[i],
 		(intptr_t) FcOffsetToPtr (leaves, leaves[i], FcCharLeaf));
     }
 #endif
@@ -135,7 +135,7 @@ FcPatternPrint (const FcPattern *p)
 {
     int		    i;
     FcPatternElt   *e;
-    
+
     if (!p)
     {
 	printf ("Null pattern\n");
@@ -160,8 +160,10 @@ FcOpPrint (FcOp op)
     case FcOpDouble: printf ("Double"); break;
     case FcOpString: printf ("String"); break;
     case FcOpMatrix: printf ("Matrix"); break;
+    case FcOpRange: printf ("Range"); break;
     case FcOpBool: printf ("Bool"); break;
     case FcOpCharSet: printf ("CharSet"); break;
+    case FcOpLangSet: printf ("LangSet"); break;
     case FcOpField: printf ("Field"); break;
     case FcOpConst: printf ("Const"); break;
     case FcOpAssign: printf ("Assign"); break;
@@ -210,8 +212,14 @@ FcExprPrint (const FcExpr *expr)
 			      expr->u.mval->xy,
 			      expr->u.mval->yx,
 			      expr->u.mval->yy); break;
+    case FcOpRange: break;
     case FcOpBool: printf ("%s", expr->u.bval ? "true" : "false"); break;
     case FcOpCharSet: printf ("charset\n"); break;
+    case FcOpLangSet:
+	printf ("langset:");
+	FcLangSetPrint(expr->u.lval);
+	printf ("\n");
+	break;
     case FcOpNil: printf ("nil\n"); break;
     case FcOpField: printf ("%s", FcObjectName(expr->u.object)); break;
     case FcOpConst: printf ("%s", expr->u.constant); break;
@@ -347,7 +355,7 @@ FcSubstPrint (const FcSubst *subst)
 {
     FcEdit	*e;
     FcTest	*t;
-    
+
     printf ("match\n");
     for (t = subst->test; t; t = t->next)
     {
diff --git a/fontconfig/src/fcdefault.c b/fontconfig/src/fcdefault.c
index 091276b70..a9165facd 100644
--- a/fontconfig/src/fcdefault.c
+++ b/fontconfig/src/fcdefault.c
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -134,7 +134,7 @@ FcDefaultSubstitute (FcPattern *pattern)
     for (i = 0; i < NUM_FC_BOOL_DEFAULTS; i++)
 	if (FcPatternObjectGet (pattern, FcBoolDefaults[i].field, 0, &v) == FcResultNoMatch)
 	    FcPatternObjectAddBool (pattern, FcBoolDefaults[i].field, FcBoolDefaults[i].value);
-    
+
     if (FcPatternObjectGet (pattern, FC_PIXEL_SIZE_OBJECT, 0, &v) == FcResultNoMatch)
     {
 	double	dpi, size, scale;
diff --git a/fontconfig/src/fcdir.c b/fontconfig/src/fcdir.c
index f927c0b28..359446c36 100644
--- a/fontconfig/src/fcdir.c
+++ b/fontconfig/src/fcdir.c
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -30,7 +30,7 @@ FcFileIsDir (const FcChar8 *file)
 {
     struct stat	    statb;
 
-    if (FcStat ((const char *) file, &statb) != 0)
+    if (FcStat (file, &statb) != 0)
 	return FcFalse;
     return S_ISDIR(statb.st_mode);
 }
@@ -45,7 +45,7 @@ FcFileScanFontConfig (FcFontSet		*set,
     FcBool	ret = FcTrue;
     int		id;
     int		count = 0;
-    
+
     id = 0;
     do
     {
@@ -164,7 +164,7 @@ FcDirScanConfig (FcFontSet	*set,
     strcpy ((char *) file, (char *) dir);
     strcat ((char *) file, "/");
     base = file + strlen ((char *) file);
-    
+
     if (FcDebug () & FC_DBG_SCAN)
 	printf ("\tScanning dir %s\n", dir);
 	
@@ -205,7 +205,7 @@ FcDirScanConfig (FcFontSet	*set,
      */
     for (i = 0; i < files->num; i++)
 	FcFileScanConfig (set, dirs, blanks, files->strs[i], config);
-    
+
 bail2:
     FcStrSetDestroy (files);
 bail1:
@@ -243,7 +243,7 @@ FcDirCacheScan (const FcChar8 *dir, FcConfig *config)
     if (FcDebug () & FC_DBG_FONTSET)
 	printf ("cache scan dir %s\n", dir);
 
-    if (FcStat ((char *) dir, &dir_stat) < 0)
+    if (FcStat (dir, &dir_stat) < 0)
     {
 	if (errno != ENOENT)
 	    ret = FcFalse;
@@ -282,12 +282,12 @@ FcDirCacheScan (const FcChar8 *dir, FcConfig *config)
 	ret = FcFalse;
 	goto bail2;
     }
-    
+
     /*
      * Write out the cache file, ignoring any troubles
      */
     FcDirCacheWrite (cache, config);
-    
+
  bail2:
     FcStrSetDestroy (dirs);
  bail1:
@@ -310,11 +310,11 @@ FcDirCacheRead (const FcChar8 *dir, FcBool force, FcConfig *config)
     /* Try to use existing cache file */
     if (!force)
 	cache = FcDirCacheLoad (dir, config, NULL);
-    
+
     /* Not using existing cache file, construct new cache */
     if (!cache)
 	cache = FcDirCacheScan (dir, config);
-    
+
     return cache;
 }
 
diff --git a/fontconfig/src/fcformat.c b/fontconfig/src/fcformat.c
index bf9401740..1368b7186 100644
--- a/fontconfig/src/fcformat.c
+++ b/fontconfig/src/fcformat.c
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -69,6 +69,7 @@
  *
  * - verbose builtin that is like FcPatternPrint
  * - allow indexing subexprs using '%{[idx]elt1,elt2{subexpr}}'
+ * - allow indexing in +, -, ? filtering?
  * - conditional/filtering/deletion on binding (using '(w)'/'(s)'/'(=)' notation)
  */
 
@@ -436,6 +437,7 @@ interpret_filter_in (FcFormatContext *c,
 
     do
     {
+	/* XXX binding */
 	if (!read_word (c) ||
 	    !FcObjectSetAdd (os, (const char *) c->word))
 	{
@@ -608,7 +610,7 @@ interpret_enumerate (FcFormatContext *c,
     {
 	FcLangSet *langset;
 	if (FcResultMatch ==
-	    FcPatternGetLangSet (pat, os->objects[0], idx, &langset))
+	    FcPatternGetLangSet (pat, os->objects[0], 0, &langset))
 	{
 	    FcStrSet *ss;
 	    if (!(ss = FcLangSetGetLangs (langset)) ||
@@ -636,6 +638,7 @@ interpret_enumerate (FcFormatContext *c,
 	    FcPatternDel (subpat, os->objects[0]);
 	    if ((lang = FcStrListNext (lang_strs)))
 	    {
+		/* XXX binding? */
 		FcPatternAddString (subpat, os->objects[0], lang);
 		done = FcFalse;
 	    }
@@ -654,6 +657,7 @@ interpret_enumerate (FcFormatContext *c,
 		if (FcResultMatch ==
 		    FcPatternGet (pat, os->objects[i], idx, &v))
 		{
+		    /* XXX binding */
 		    FcPatternAdd (subpat, os->objects[i], v, FcFalse);
 		    done = FcFalse;
 		}
@@ -788,6 +792,8 @@ cescape (FcFormatContext *c,
 	 const FcChar8   *str,
 	 FcStrBuf        *buf)
 {
+    /* XXX escape \n etc? */
+
     while(*str)
     {
 	switch (*str)
@@ -825,6 +831,8 @@ xmlescape (FcFormatContext *c,
 	   const FcChar8   *str,
 	   FcStrBuf        *buf)
 {
+    /* XXX escape \n etc? */
+
     while(*str)
     {
 	switch (*str)
diff --git a/fontconfig/src/fcfreetype.c b/fontconfig/src/fcfreetype.c
index 68596f5a4..d37af2d0e 100644
--- a/fontconfig/src/fcfreetype.c
+++ b/fontconfig/src/fcfreetype.c
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -115,18 +115,19 @@ typedef struct {
 #define FC_ENCODING_MAC_ROMAN	"MACINTOSH"
 
 static const FcFtEncoding   fcFtEncoding[] = {
- {  TT_PLATFORM_APPLE_UNICODE,	TT_ENCODING_DONT_CARE,	"UCS-2BE" },
+ {  TT_PLATFORM_APPLE_UNICODE,	TT_ENCODING_DONT_CARE,	"UTF-16BE" },
  {  TT_PLATFORM_MACINTOSH,	TT_MAC_ID_ROMAN,	"MACINTOSH" },
  {  TT_PLATFORM_MACINTOSH,	TT_MAC_ID_JAPANESE,	"SJIS" },
+ {  TT_PLATFORM_MICROSOFT,	TT_MS_ID_SYMBOL_CS,	"UTF-16BE" },
  {  TT_PLATFORM_MICROSOFT,	TT_MS_ID_UNICODE_CS,	"UTF-16BE" },
  {  TT_PLATFORM_MICROSOFT,	TT_MS_ID_SJIS,		"SJIS-WIN" },
  {  TT_PLATFORM_MICROSOFT,	TT_MS_ID_GB2312,	"GB2312" },
  {  TT_PLATFORM_MICROSOFT,	TT_MS_ID_BIG_5,		"BIG-5" },
  {  TT_PLATFORM_MICROSOFT,	TT_MS_ID_WANSUNG,	"Wansung" },
  {  TT_PLATFORM_MICROSOFT,	TT_MS_ID_JOHAB,		"Johab" },
- {  TT_PLATFORM_MICROSOFT,	TT_MS_ID_UCS_4,		"UCS-2BE" },
+ {  TT_PLATFORM_MICROSOFT,	TT_MS_ID_UCS_4,		"UTF-16BE" },
  {  TT_PLATFORM_ISO,		TT_ISO_ID_7BIT_ASCII,	"ASCII" },
- {  TT_PLATFORM_ISO,		TT_ISO_ID_10646,	"UCS-2BE" },
+ {  TT_PLATFORM_ISO,		TT_ISO_ID_10646,	"UTF-16BE" },
  {  TT_PLATFORM_ISO,		TT_ISO_ID_8859_1,	"ISO-8859-1" },
 };
 
@@ -251,14 +252,14 @@ static const FcFtLanguage   fcFtLanguage[] = {
  {  TT_PLATFORM_MACINTOSH,	TT_MAC_LANGID_DZONGKHA,		    "dz" },
  {  TT_PLATFORM_MACINTOSH,	TT_MAC_LANGID_JAVANESE,		    "jw" },
  {  TT_PLATFORM_MACINTOSH,	TT_MAC_LANGID_SUNDANESE,	    "su" },
-    
+
 #if 0  /* these seem to be errors that have been dropped */
 
  {  TT_PLATFORM_MACINTOSH,	TT_MAC_LANGID_SCOTTISH_GAELIC },
  {  TT_PLATFORM_MACINTOSH,	TT_MAC_LANGID_IRISH_GAELIC },
 
 #endif
-    
+
   /* The following codes are new as of 2000-03-10 */
  {  TT_PLATFORM_MACINTOSH,	TT_MAC_LANGID_GALICIAN,		    "gl" },
  {  TT_PLATFORM_MACINTOSH,	TT_MAC_LANGID_AFRIKAANS,	    "af" },
@@ -494,7 +495,7 @@ static const FcFtLanguage   fcFtLanguage[] = {
  {  TT_PLATFORM_MICROSOFT,	TT_MS_LANGID_PASHTO_AFGHANISTAN,	"ps" },
  {  TT_PLATFORM_MICROSOFT,	TT_MS_LANGID_FILIPINO_PHILIPPINES,	"phi" },
  {  TT_PLATFORM_MICROSOFT,	TT_MS_LANGID_DHIVEHI_MALDIVES,		"div" },
-    
+
  {  TT_PLATFORM_MICROSOFT,	TT_MS_LANGID_OROMO_ETHIOPIA,		"om" },
  {  TT_PLATFORM_MICROSOFT,	TT_MS_LANGID_TIGRIGNA_ETHIOPIA,		"ti" },
  {  TT_PLATFORM_MICROSOFT,	TT_MS_LANGID_TIGRIGNA_ERYTHREA,		"ti" },
@@ -743,7 +744,7 @@ FcSfntNameTranscode (FT_SfntName *sname)
 	
 	while (in_bytes_left)
 	{
-	    size_t	did = iconv (cd, 
+	    size_t	did = iconv (cd,
 				 &inbuf, &in_bytes_left,
 				 &outbuf, &out_bytes_left);
 	    if (did == (size_t) (-1))
@@ -785,7 +786,7 @@ FcSfntNameLanguage (FT_SfntName *sname)
     {
 	language_id = TT_MAC_LANGID_JAPANESE;
     }
-    
+
     for (i = 0; i < NUM_FC_FT_LANGUAGE; i++)
 	if (fcFtLanguage[i].platform_id == platform_id &&
 	    (fcFtLanguage[i].language_id == TT_LANGUAGE_DONT_CARE ||
@@ -870,7 +871,7 @@ FcVendorMatch(const FT_Char vendor[4], const FT_Char *vendor_string)
 {
     /* vendor is not necessarily NUL-terminated. */
     int i, len;
-    
+
     len = strlen((char *) vendor_string);
     if (memcmp(vendor, vendor_string, len) != 0)
         return FcFalse;
@@ -926,7 +927,7 @@ static const FcChar8 *
 FcVendorFoundry(const FT_Char vendor[4])
 {
     int i;
-    
+
     if (vendor)
 	for(i = 0; i < NUM_VENDOR_FOUNDRIES; i++)
 	    if (FcVendorMatch (vendor, FcVendorFoundries[i].vendor))
@@ -1139,7 +1140,7 @@ FcFreeTypeQueryFace (const FT_Face  face,
     const FcChar8   *exclusiveLang = 0;
     FT_SfntName	    sname;
     FT_UInt    	    snamei, snamec;
-    
+
     int		    nfamily = 0;
     int		    nfamily_lang = 0;
     int		    nstyle = 0;
@@ -1151,7 +1152,7 @@ FcFreeTypeQueryFace (const FT_Face  face,
 
     FcChar8	    *style = 0;
     int		    st;
-    
+
     pat = FcPatternCreate ();
     if (!pat)
 	goto bail0;
@@ -1177,7 +1178,7 @@ FcFreeTypeQueryFace (const FT_Face  face,
      * the Postscript FontInfo dictionary.  Finally, the
      * BDF properties will queried.
      */
-    
+
     if (os2 && os2->version >= 0x0001 && os2->version != 0xffff)
         foundry = FcVendorFoundry(os2->achVendID);
 
@@ -1247,7 +1248,7 @@ FcFreeTypeQueryFace (const FT_Face  face,
 #endif
 		case TT_NAME_ID_PREFERRED_FAMILY:
 		case TT_NAME_ID_FONT_FAMILY:
-#if 0	    
+#if 0	
 		case TT_NAME_ID_PS_NAME:
 		case TT_NAME_ID_UNIQUE_ID:
 #endif
@@ -1334,7 +1335,7 @@ FcFreeTypeQueryFace (const FT_Face  face,
 	}
     }
 
-    if (!nfamily && face->family_name && 
+    if (!nfamily && face->family_name &&
 	FcStrCmpIgnoreBlanksAndCase ((FcChar8 *) face->family_name, (FcChar8 *) "") != 0)
     {
 	if (FcDebug () & FC_DBG_SCANV)
@@ -1343,7 +1344,7 @@ FcFreeTypeQueryFace (const FT_Face  face,
 	    goto bail1;
 	++nfamily;
     }
-    
+
     if (!nstyle && face->style_name &&
 	FcStrCmpIgnoreBlanksAndCase ((FcChar8 *) face->style_name, (FcChar8 *) "") != 0)
     {
@@ -1353,7 +1354,7 @@ FcFreeTypeQueryFace (const FT_Face  face,
 	    goto bail1;
 	++nstyle;
     }
-    
+
     if (!nfamily)
     {
 	FcChar8	*start, *end;
@@ -1432,7 +1433,7 @@ FcFreeTypeQueryFace (const FT_Face  face,
 	    }
 	    if (bits & (1 << bit))
 	    {
-		/* 
+		/*
 		 * If the font advertises support for multiple
 		 * "exclusive" languages, then include support
 		 * for any language found to have coverage
@@ -1504,7 +1505,7 @@ FcFreeTypeQueryFace (const FT_Face  face,
      * Type 1: Check for FontInfo dictionary information
      * Code from g2@magestudios.net (Gerard Escalante)
      */
-    
+
 #if HAVE_FT_GET_PS_FONT_INFO
     if (FT_Get_PS_Font_Info(face, &psfontinfo) == 0)
     {
@@ -1515,23 +1516,23 @@ FcFreeTypeQueryFace (const FT_Face  face,
     		printf ("\tType1 weight %s maps to %d\n",
 			psfontinfo.weight, weight);
 	}
-     
+
 #if 0
-	/* 
+	/*
 	 * Don't bother with italic_angle; FreeType already extracts that
 	 * information for us and sticks it into style_flags
 	 */
         if (psfontinfo.italic_angle)
-            slant = FC_SLANT_ITALIC; 
+            slant = FC_SLANT_ITALIC;
         else
-            slant = FC_SLANT_ROMAN; 
+            slant = FC_SLANT_ROMAN;
 #endif
 
         if(!foundry)
             foundry = FcNoticeFoundry(psfontinfo.notice);
     }
 #endif /* HAVE_FT_GET_PS_FONT_INFO */
-    
+
 #if HAVE_FT_GET_BDF_PROPERTY
     /*
      * Finally, look for a FOUNDRY BDF property if no other
@@ -1553,7 +1554,7 @@ FcFreeTypeQueryFace (const FT_Face  face,
 	     prop.type == BDF_PROPERTY_TYPE_CARDINAL))
 	{
 	    FT_Int32	value;
-	    
+	
 	    if (prop.type == BDF_PROPERTY_TYPE_INTEGER)
 		value = prop.u.integer;
 	    else
@@ -1730,7 +1731,7 @@ FcFreeTypeQueryFace (const FT_Face  face,
      * Drop our reference to the charset
      */
     FcCharSetDestroy (cs);
-    
+
     return pat;
 
 bail2:
@@ -1750,10 +1751,10 @@ FcFreeTypeQuery(const FcChar8	*file,
     FT_Face	    face;
     FT_Library	    ftLibrary;
     FcPattern	    *pat = NULL;
-    
+
     if (FT_Init_FreeType (&ftLibrary))
 	return NULL;
-    
+
     if (FT_New_Face (ftLibrary, (char *) file, id, &face))
 	goto bail;
 
@@ -2225,7 +2226,7 @@ static const FcCharMap AdobeSymbol = {
     AdobeSymbolEnt,
     sizeof (AdobeSymbolEnt) / sizeof (AdobeSymbolEnt[0]),
 };
-    
+
 static const FcFontDecode fcFontDecoders[] = {
     { ft_encoding_unicode,	0,		(1 << 21) - 1 },
     { ft_encoding_symbol,	&AdobeSymbol,	(1 << 16) - 1 },
@@ -2310,7 +2311,7 @@ static FcBool
 FcFreeTypeUseNames (FT_Face face)
 {
     FT_Int  map;
-    
+
     if (!FT_Has_PS_Glyph_Names (face))
 	return FcFalse;
     for (map = 0; map < face->num_charmaps; map++)
@@ -2330,7 +2331,7 @@ FcUcs4ToGlyphName (FcChar32 ucs4)
     {
 	if (_fc_glyph_names[gn].ucs == ucs4)
 	    return _fc_glyph_names[gn].name;
-	if (!r) 
+	if (!r)
 	{
 	    r = (int) (ucs4 % FC_GLYPHNAME_REHASH);
 	    if (!r)
@@ -2355,7 +2356,7 @@ FcGlyphNameToUcs4 (FcChar8 *name)
     {
 	if (!strcmp ((char *) name, (char *) _fc_glyph_names[gn].name))
 	    return _fc_glyph_names[gn].ucs;
-	if (!r) 
+	if (!r)
 	{
 	    r = (int) (h % FC_GLYPHNAME_REHASH);
 	    if (!r)
@@ -2478,14 +2479,14 @@ FcFreeTypeCharIndex (FT_Face face, FcChar32 ucs4)
 }
 
 static FcBool
-FcFreeTypeCheckGlyph (FT_Face face, FcChar32 ucs4, 
+FcFreeTypeCheckGlyph (FT_Face face, FcChar32 ucs4,
 		      FT_UInt glyph, FcBlanks *blanks,
 		      FT_Pos *advance,
 		      FcBool using_strike)
 {
     FT_Int	    load_flags = FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH | FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
     FT_GlyphSlot    slot;
-    
+
     if (using_strike)
 	load_flags &= ~FT_LOAD_NO_SCALE;
 
@@ -2498,14 +2499,14 @@ FcFreeTypeCheckGlyph (FT_Face face, FcChar32 ucs4,
      */
     if (face->face_flags & FT_FACE_FLAG_SCALABLE)
 	load_flags |= FT_LOAD_NO_BITMAP;
-    
+
     if (FT_Load_Glyph (face, glyph, load_flags))
 	return FcFalse;
-    
+
     slot = face->glyph;
     if (!glyph)
 	return FcFalse;
-    
+
     *advance = slot->metrics.horiAdvance;
 
     switch (slot->format) {
@@ -2559,7 +2560,7 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face, FcBlanks *blanks, int *spacing
     fcs = FcCharSetCreate ();
     if (!fcs)
 	goto bail0;
-    
+
 #if HAVE_FT_SELECT_SIZE
     if (strike_index >= 0) {
 	if (FT_Select_Size (face, strike_index) != FT_Err_Ok)
@@ -2586,10 +2587,10 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face, FcBlanks *blanks, int *spacing
 	    {
 		ucs4 = map->ent[i].bmp;
 		glyph = FT_Get_Char_Index (face, map->ent[i].encode);
-		if (glyph && 
+		if (glyph &&
 		    FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
 		{
-		    /* 
+		    /*
 		     * ignore glyphs with zero advance. They’re
 		     * combining characters, and while their behaviour
 		     * isn’t well defined for monospaced applications in
@@ -2701,7 +2702,7 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face, FcBlanks *blanks, int *spacing
 	    if (FT_Get_Glyph_Name (face, glyph, name_buf, FC_GLYPHNAME_BUFLEN+1) == 0)
 	    {
 		ucs4 = FcGlyphNameToUcs4 (name_buf);
-		if (ucs4 != 0xffff && 
+		if (ucs4 != 0xffff &&
 		    FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike))
 		{
 		    if (advance)
@@ -2771,13 +2772,13 @@ FcCharSet *
 FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
 {
     FcCharSet	*cs;
-    
+
     cs = FcFreeTypeCharSetAndSpacingForSize (face, blanks, spacing, -1);
     /*
      * Check for bitmap-only ttf fonts that are missing the glyf table.
      * In that case, pick a size and look for glyphs in that size instead
      */
-    if (FcCharSetCount (cs) == 0) 
+    if (FcCharSetCount (cs) == 0)
     {
 	/* Check for non-scalable TT fonts */
 	if (!(face->face_flags & FT_FACE_FLAG_SCALABLE) &&
@@ -2789,7 +2790,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing)
 
 	    /* Select the face closest to 16 pixels tall */
 	    for (i = 1; i < face->num_fixed_sizes; i++) {
-		if (abs (face->available_sizes[i].height - 16) < 
+		if (abs (face->available_sizes[i].height - 16) <
 		    abs (face->available_sizes[strike_index].height - 16))
 		    strike_index = i;
 	    }
@@ -2825,7 +2826,7 @@ FcFreeTypeCharSet (FT_Face face, FcBlanks *blanks)
  */
 #define FcIsSpace(x)	    (040 == (x))
 #define FcIsValidScript(x)  (FcIsLower(x) || FcIsUpper (x) || FcIsSpace(x))
-			     
+			
 static void
 addtag(FcChar8 *complex_, FT_ULong tag)
 {
@@ -2836,7 +2837,7 @@ addtag(FcChar8 *complex_, FT_ULong tag)
     tagstring[2] = (FcChar8)(tag >> 8),
     tagstring[3] = (FcChar8)(tag);
     tagstring[4] = '\0';
-    
+
     /* skip tags which aren't alphabetic, under the assumption that
      * they're probably broken
      */
@@ -2964,7 +2965,7 @@ FcFontCapabilities(FT_Face face)
     if (!issilgraphitefont && !gsub_count && !gpos_count)
     	goto bail;
 
-    maxsize = (((FT_ULong) gpos_count + (FT_ULong) gsub_count) * OTLAYOUT_LEN + 
+    maxsize = (((FT_ULong) gpos_count + (FT_ULong) gsub_count) * OTLAYOUT_LEN +
 	       (issilgraphitefont ? 13 : 0));
     complex_ = malloc (sizeof (FcChar8) * maxsize);
     if (!complex_)
diff --git a/fontconfig/src/fcfs.c b/fontconfig/src/fcfs.c
index 0e97501f8..6625687c1 100644
--- a/fontconfig/src/fcfs.c
+++ b/fontconfig/src/fcfs.c
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -61,7 +61,7 @@ FcFontSetAdd (FcFontSet *s, FcPattern *font)
 {
     FcPattern	**f;
     int		sfont;
-    
+
     if (s->nfont == s->sfont)
     {
 	sfont = s->sfont + 32;
@@ -85,7 +85,7 @@ FcBool
 FcFontSetSerializeAlloc (FcSerialize *serialize, const FcFontSet *s)
 {
     int i;
-    
+
     if (!FcSerializeAlloc (serialize, s, sizeof (FcFontSet)))
 	return FcFalse;
     if (!FcSerializeAlloc (serialize, s->fonts, s->nfont * sizeof (FcPattern *)))
@@ -111,7 +111,7 @@ FcFontSetSerialize (FcSerialize *serialize, const FcFontSet * s)
 	return NULL;
     *s_serialize = *s;
     s_serialize->sfont = s_serialize->nfont;
-    
+
     fonts_serialize = FcSerializePtr (serialize, s->fonts);
     if (!fonts_serialize)
 	return NULL;
diff --git a/fontconfig/src/fcinit.c b/fontconfig/src/fcinit.c
index 3789d67b5..b7966b6db 100644
--- a/fontconfig/src/fcinit.c
+++ b/fontconfig/src/fcinit.c
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -58,18 +58,18 @@ FcConfig *
 FcInitLoadConfig (void)
 {
     FcConfig	*config;
-    
+
     FcInitDebug ();
     config = FcConfigCreate ();
     if (!config)
-	return FcFalse;
-    
+	return NULL;
+
     if (!FcConfigParseAndLoad (config, 0, FcTrue))
     {
 	FcConfigDestroy (config);
 	return FcInitFallbackConfig ();
     }
-    
+
     if (config->cacheDirs && config->cacheDirs->num == 0)
     {
 	fprintf (stderr,
diff --git a/fontconfig/src/fcint.h b/fontconfig/src/fcint.h
index 233b4c302..83a7a435b 100644
--- a/fontconfig/src/fcint.h
+++ b/fontconfig/src/fcint.h
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -107,6 +107,10 @@
 
 #define FC_MEM_NUM	    30
 
+#define _FC_ASSERT_STATIC1(_line, _cond) typedef int _static_assert_on_line_##_line##_failed[(_cond)?1:-1]
+#define _FC_ASSERT_STATIC0(_line, _cond) _FC_ASSERT_STATIC1 (_line, (_cond))
+#define FC_ASSERT_STATIC(_cond) _FC_ASSERT_STATIC0 (__LINE__, (_cond))
+
 #define FC_MIN(a,b) ((a) < (b) ? (a) : (b))
 #define FC_MAX(a,b) ((a) > (b) ? (a) : (b))
 #define FC_ABS(a)   ((a) < 0 ? -(a) : (a))
@@ -130,7 +134,7 @@ typedef enum _FcValueBinding {
  * Serialized data structures use only offsets instead of pointers
  * A low bit of 1 indicates an offset.
  */
- 
+
 /* Is the provided pointer actually an offset? */
 #define FcIsEncodedOffset(p)	((((intptr_t) (p)) & 1) != 0)
 
@@ -181,13 +185,13 @@ typedef struct _FcValueList {
 } FcValueList;
 
 #define FcValueListNext(vl)	FcPointerMember(vl,next,FcValueList)
-			     
+			
 typedef int FcObject;
 
 typedef struct _FcPatternElt *FcPatternEltPtr;
 
 /*
- * Pattern elts are stuck in a structure connected to the pattern, 
+ * Pattern elts are stuck in a structure connected to the pattern,
  * so they get moved around when the pattern is resized. Hence, the
  * values field must be a pointer/offset instead of just an offset
  */
@@ -216,13 +220,13 @@ struct _FcPattern {
 				 fs->fonts[i])
 						
 typedef enum _FcOp {
-    FcOpInteger, FcOpDouble, FcOpString, FcOpMatrix, FcOpBool, FcOpCharSet, 
+    FcOpInteger, FcOpDouble, FcOpString, FcOpMatrix, FcOpRange, FcOpBool, FcOpCharSet, FcOpLangSet,
     FcOpNil,
     FcOpField, FcOpConst,
-    FcOpAssign, FcOpAssignReplace, 
+    FcOpAssign, FcOpAssignReplace,
     FcOpPrependFirst, FcOpPrepend, FcOpAppend, FcOpAppendLast,
     FcOpQuest,
-    FcOpOr, FcOpAnd, FcOpEqual, FcOpNotEqual, 
+    FcOpOr, FcOpAnd, FcOpEqual, FcOpNotEqual,
     FcOpContains, FcOpListing, FcOpNotContains,
     FcOpLess, FcOpLessEqual, FcOpMore, FcOpMoreEqual,
     FcOpPlus, FcOpMinus, FcOpTimes, FcOpDivide,
@@ -235,12 +239,13 @@ typedef struct _FcExpr {
     union {
 	int	    ival;
 	double	    dval;
-	FcChar8	    *sval;
+	const FcChar8	    *sval;
 	FcMatrix    *mval;
 	FcBool	    bval;
 	FcCharSet   *cval;
+	FcLangSet   *lval;
 	FcObject    object;
-	FcChar8	    *constant;
+	const FcChar8	    *constant;
 	struct {
 	    struct _FcExpr *left, *right;
 	} tree;
@@ -253,7 +258,7 @@ struct _FcExprPage {
   FcExprPage *next_page;
   FcExpr *next;
   FcExpr exprs[(1024 - 2/* two pointers */ - 2/* malloc overhead */) * sizeof (void *) / sizeof (FcExpr)];
-  FcExpr end[0];
+  FcExpr end[];
 };
 
 typedef enum _FcQual {
@@ -373,7 +378,7 @@ typedef struct _FcSerialize {
     void		*linear;
     FcSerializeBucket	*buckets[FC_SERIALIZE_HASH_SIZE];
 } FcSerialize;
-    
+
 /*
  * To map adobe glyph names to unicode values, a precomputed hash
  * table is used
@@ -387,14 +392,14 @@ typedef struct _FcGlyphName {
 /*
  * To perform case-insensitive string comparisons, a table
  * is used which holds three different kinds of folding data.
- * 
+ *
  * The first is a range of upper case values mapping to a range
  * of their lower case equivalents.  Within each range, the offset
  * between upper and lower case is constant.
  *
  * The second is a range of upper case values which are interleaved
  * with their lower case equivalents.
- * 
+ *
  * The third is a set of raw unicode values mapping to a list
  * of unicode values for comparison purposes.  This allows conversion
  * of ß to "ss" so that SS, ss and ß all match.  A separate array
@@ -448,7 +453,7 @@ struct _FcConfig {
     FcBlanks	*blanks;
     /*
      * List of directories containing fonts,
-     * built by recursively scanning the set 
+     * built by recursively scanning the set
      * of configured directories
      */
     FcStrSet	*fontDirs;
@@ -497,7 +502,7 @@ struct _FcConfig {
 
     FcExprPage *expr_pool;	    /* pool of FcExpr's */
 };
- 
+
 extern FcPrivate FcConfig	*_fcConfig;
 
 typedef struct _FcFileTime {
@@ -507,6 +512,13 @@ typedef struct _FcFileTime {
 
 typedef struct _FcCharMap FcCharMap;
 
+typedef struct _FcRange	    FcRange;
+
+struct _FcRange {
+    FcChar32 begin;
+    FcChar32 end;
+};
+
 /* fcblanks.c */
 
 /* fccache.c */
@@ -519,7 +531,7 @@ FcDirCacheBuild (FcFontSet *set, const FcChar8 *dir, struct stat *dir_stat, FcSt
 
 FcPrivate FcBool
 FcDirCacheWrite (FcCache *cache, FcConfig *config);
-    
+
 FcPrivate void
 FcCacheObjectReference (void *object);
 
@@ -528,16 +540,12 @@ FcCacheObjectDereference (void *object);
 
 FcPrivate void
 FcCacheFini (void);
-    
+
 FcPrivate void
 FcDirCacheReference (FcCache *cache, int nref);
 
-#ifdef _WIN32
 FcPrivate int
 FcStat (const char *file, struct stat *statb);
-#else
-#define FcStat stat
-#endif
 
 /* fccfg.c */
 
@@ -606,13 +614,13 @@ FcPrivate FcFileTime
 FcConfigModifiedTime (FcConfig *config);
 
 FcPrivate FcBool
-FcConfigAddCache (FcConfig *config, FcCache *cache, 
+FcConfigAddCache (FcConfig *config, FcCache *cache,
 		  FcSetName set, FcStrSet *dirSet);
 
 /* fcserialize.c */
 FcPrivate intptr_t
 FcAlignSize (intptr_t size);
-    
+
 FcPrivate FcSerialize *
 FcSerializeCreate (void);
 
@@ -702,7 +710,7 @@ FcSubstPrint (const FcSubst *subst);
 
 FcPrivate void
 FcCharSetPrint (const FcCharSet *c);
-    
+
 extern FcPrivate int FcDebugVal;
 
 #define FcDebug() (FcDebugVal)
@@ -763,12 +771,12 @@ FcMemFree (int kind, int size);
 
 /* fclang.c */
 FcPrivate FcLangSet *
-FcFreeTypeLangSet (const FcCharSet  *charset, 
+FcFreeTypeLangSet (const FcCharSet  *charset,
 		   const FcChar8    *exclusiveLang);
 
 FcPrivate FcLangResult
 FcLangCompare (const FcChar8 *s1, const FcChar8 *s2);
-    
+
 FcPrivate FcLangSet *
 FcLangSetPromote (const FcChar8 *lang);
 
@@ -885,13 +893,13 @@ FcPatternObjectAddWithBinding  (FcPattern	*p,
 
 FcPrivate FcBool
 FcPatternObjectAdd (FcPattern *p, FcObject object, FcValue value, FcBool append);
-    
+
 FcPrivate FcBool
 FcPatternObjectAddWeak (FcPattern *p, FcObject object, FcValue value, FcBool append);
-    
+
 FcPrivate FcResult
 FcPatternObjectGet (const FcPattern *p, FcObject object, int id, FcValue *v);
-    
+
 FcPrivate FcBool
 FcPatternObjectDel (FcPattern *p, FcObject object);
 
diff --git a/fontconfig/src/fclang.c b/fontconfig/src/fclang.c
index 1d62c4e3f..be42b58c4 100644
--- a/fontconfig/src/fclang.c
+++ b/fontconfig/src/fclang.c
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -71,8 +71,22 @@ FcLangSetBitGet (const FcLangSet *ls,
   return ((ls->map[bucket] >> (id & 0x1f)) & 1) ? FcTrue : FcFalse;
 }
 
+static void
+FcLangSetBitReset (FcLangSet    *ls,
+		   unsigned int  id)
+{
+  int bucket;
+
+  id = fcLangCharSetIndices[id];
+  bucket = id >> 5;
+  if (bucket >= ls->map_size)
+    return; /* shouldn't happen really */
+
+  ls->map[bucket] &= ~((FcChar32) 1 << (id & 0x1f));
+}
+
 FcLangSet *
-FcFreeTypeLangSet (const FcCharSet  *charset, 
+FcFreeTypeLangSet (const FcCharSet  *charset,
 		   const FcChar8    *exclusiveLang)
 {
     int		    i, j;
@@ -85,7 +99,7 @@ FcFreeTypeLangSet (const FcCharSet  *charset,
     ls = FcLangSetCreate ();
     if (!ls)
 	return 0;
-    if (FcDebug() & FC_DBG_LANGSET) 
+    if (FcDebug() & FC_DBG_LANGSET)
     {
 	printf ("font charset");
 	FcCharSetPrint (charset);
@@ -93,7 +107,7 @@ FcFreeTypeLangSet (const FcCharSet  *charset,
     }
     for (i = 0; i < NUM_LANG_CHAR_SET; i++)
     {
-	if (FcDebug() & FC_DBG_LANGSET) 
+	if (FcDebug() & FC_DBG_LANGSET)
 	{
 	    printf ("%s charset", fcLangCharSets[i].lang);
 	    FcCharSetPrint (&fcLangCharSets[i].charset);
@@ -112,7 +126,7 @@ FcFreeTypeLangSet (const FcCharSet  *charset,
 		continue;
 
 	    for (j = 0; j < fcLangCharSets[i].charset.num; j++)
-		if (FcCharSetLeaf(&fcLangCharSets[i].charset, j) != 
+		if (FcCharSetLeaf(&fcLangCharSets[i].charset, j) !=
 		    FcCharSetLeaf(exclusiveCharset, j))
 		    continue;
 	}
@@ -121,7 +135,7 @@ FcFreeTypeLangSet (const FcCharSet  *charset,
 	{
 	    if (missing && missing < 10)
 	    {
-		FcCharSet   *missed = FcCharSetSubtract (&fcLangCharSets[i].charset, 
+		FcCharSet   *missed = FcCharSetSubtract (&fcLangCharSets[i].charset,
 							 charset);
 		FcChar32    ucs4;
 		FcChar32    map[FC_CHARSET_MAP_SIZE];
@@ -154,8 +168,8 @@ FcFreeTypeLangSet (const FcCharSet  *charset,
 
     if (FcDebug() & FC_DBG_SCANV)
 	printf ("\n");
-    
-    
+
+
     return ls;
 }
 
@@ -188,7 +202,7 @@ FcLangCompare (const FcChar8 *s1, const FcChar8 *s2)
 }
 
 /*
- * Return FcTrue when super contains sub. 
+ * Return FcTrue when super contains sub.
  *
  * super contains sub if super and sub have the same
  * language and either the same country or one
@@ -329,9 +343,9 @@ FcLangSetIndex (const FcChar8 *lang)
 {
     int	    low, high, mid = 0;
     int	    cmp = 0;
-    FcChar8 firstChar = FcToLower(lang[0]); 
+    FcChar8 firstChar = FcToLower(lang[0]);
     FcChar8 secondChar = firstChar ? FcToLower(lang[1]) : '\0';
-    
+
     if (firstChar < 'a')
     {
 	low = 0;
@@ -360,11 +374,11 @@ FcLangSetIndex (const FcChar8 *lang)
 	{   /* fast path for resolving 2-letter languages (by far the most common) after
 	     * finding the first char (probably already true because of the hash table) */
 	    cmp = fcLangCharSets[mid].lang[1] - secondChar;
-	    if (cmp == 0 && 
-		(fcLangCharSets[mid].lang[2] != '\0' || 
+	    if (cmp == 0 &&
+		(fcLangCharSets[mid].lang[2] != '\0' ||
 		 lang[2] != '\0'))
 	    {
-		cmp = FcStrCmpIgnoreCase(fcLangCharSets[mid].lang+2, 
+		cmp = FcStrCmpIgnoreCase(fcLangCharSets[mid].lang+2,
 					 lang+2);
 	    }
 	}
@@ -400,6 +414,23 @@ FcLangSetAdd (FcLangSet *ls, const FcChar8 *lang)
     return FcStrSetAdd (ls->extra, lang);
 }
 
+FcBool
+FcLangSetDel (FcLangSet *ls, const FcChar8 *lang)
+{
+    int	id;
+
+    id = FcLangSetIndex (lang);
+    if (id >= 0)
+    {
+	FcLangSetBitReset (ls, id);
+    }
+    else if (ls->extra)
+    {
+	FcStrSetDel (ls->extra, lang);
+    }
+    return FcTrue;
+}
+
 FcLangResult
 FcLangSetHasLang (const FcLangSet *ls, const FcChar8 *lang)
 {
@@ -505,6 +536,7 @@ FcLangSetCompare (const FcLangSet *lsa, const FcLangSet *lsb)
 
 /*
  * Used in computing values -- mustn't allocate any storage
+ * XXX Not thread-safe
  */
 FcLangSet *
 FcLangSetPromote (const FcChar8 *lang)
@@ -515,6 +547,7 @@ FcLangSetPromote (const FcChar8 *lang)
     int			id;
 
     memset (ls.map, '\0', sizeof (ls.map));
+    ls.map_size = NUM_LANG_SET_MAP;
     ls.extra = 0;
     id = FcLangSetIndex (lang);
     if (id > 0)
@@ -727,7 +760,7 @@ FcLangSetContains (const FcLangSet *lsa, const FcLangSet *lsb)
 	if (missing)
 	{
 	    for (j = 0; j < 32; j++)
-		if (missing & (1 << j)) 
+		if (missing & (1 << j))
 		{
 		    if (!FcLangSetContainsLang (lsa,
 						fcLangCharSets[fcLangCharSetIndicesInv[i*32 + j]].lang))
@@ -816,6 +849,37 @@ FcLangSetGetLangs (const FcLangSet *ls)
     return langs;
 }
 
+static FcLangSet *
+FcLangSetOperate(const FcLangSet	*a,
+		 const FcLangSet	*b,
+		 FcBool			(*func) (FcLangSet 	*ls,
+						 const FcChar8	*s))
+{
+    FcLangSet	*langset = FcLangSetCopy (a);
+    FcStrList	*sl = FcStrListCreate (FcLangSetGetLangs (b));
+    FcChar8	*str;
+
+    while ((str = FcStrListNext (sl)))
+    {
+	func (langset, str);
+    }
+    FcStrListDone (sl);
+
+    return langset;
+}
+
+FcLangSet *
+FcLangSetUnion (const FcLangSet *a, const FcLangSet *b)
+{
+    return FcLangSetOperate(a, b, FcLangSetAdd);
+}
+
+FcLangSet *
+FcLangSetSubtract (const FcLangSet *a, const FcLangSet *b)
+{
+    return FcLangSetOperate(a, b, FcLangSetDel);
+}
+
 #define __fclang__
 #include "fcaliastail.h"
 #include "fcftaliastail.h"
diff --git a/fontconfig/src/fclist.c b/fontconfig/src/fclist.c
index d804c1503..9a84b5c7e 100644
--- a/fontconfig/src/fclist.c
+++ b/fontconfig/src/fclist.c
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -46,7 +46,7 @@ FcObjectSetAdd (FcObjectSet *os, const char *object)
     int		s;
     const char	**objects;
     int		high, low, mid, c;
-    
+
     if (os->nobject == os->sobject)
     {
 	s = os->sobject + 4;
@@ -81,7 +81,7 @@ FcObjectSetAdd (FcObjectSet *os, const char *object)
     }
     if (c < 0)
 	mid++;
-    memmove (os->objects + mid + 1, os->objects + mid, 
+    memmove (os->objects + mid + 1, os->objects + mid,
 	     (os->nobject - mid) * sizeof (const char *));
     os->objects[mid] = object;
     os->nobject++;
@@ -140,8 +140,8 @@ FcListValueListMatchAny (FcValueListPtr patOrig,	    /* pattern */
 	     *  where it requires an exact match)
 	     */
 	    if (FcConfigCompareValue (&fnt->value,
-				      FcOpListing, 
-				      &pat->value)) 
+				      FcOpListing,
+				      &pat->value))
 		break;
 	}
 	if (fnt == NULL)
@@ -226,8 +226,8 @@ FcListPatternMatchAny (const FcPattern *p,
 static FcChar32
 FcListMatrixHash (const FcMatrix *m)
 {
-    int	    xx = (int) (m->xx * 100), 
-	    xy = (int) (m->xy * 100), 
+    int	    xx = (int) (m->xx * 100),
+	    xy = (int) (m->xy * 100),
 	    yx = (int) (m->yx * 100),
 	    yy = (int) (m->yy * 100);
 
@@ -265,7 +265,7 @@ static FcChar32
 FcListValueListHash (FcValueListPtr list)
 {
     FcChar32	h = 0;
-    
+
     while (list != NULL)
     {
 	h = h ^ FcListValueHash (&list->value);
@@ -303,7 +303,7 @@ typedef struct _FcListHashTable {
     int		    entries;
     FcListBucket    *buckets[FC_LIST_HASH_SIZE];
 } FcListHashTable;
-    
+
 static void
 FcListHashTableInit (FcListHashTable *table)
 {
@@ -382,7 +382,7 @@ FcListAppend (FcListHashTable	*table,
     for (prev = &table->buckets[hash % FC_LIST_HASH_SIZE];
 	 (bucket = *prev); prev = &(bucket->next))
     {
-	if (bucket->hash == hash && 
+	if (bucket->hash == hash &&
 	    FcListPatternEqual (bucket->pattern, font, os))
 	    return FcTrue;
     }
@@ -395,7 +395,7 @@ FcListAppend (FcListHashTable	*table,
     bucket->pattern = FcPatternCreate ();
     if (!bucket->pattern)
 	goto bail1;
-    
+
     for (o = 0; o < os->nobject; o++)
     {
 	if (!strcmp (os->objects[o], FC_FAMILY) || !strcmp (os->objects[o], FC_FAMILYLANG))
@@ -425,8 +425,8 @@ FcListAppend (FcListHashTable	*table,
 	    for (v = FcPatternEltValues(e), idx = 0; v;
 		 v = FcValueListNext(v), ++idx)
 	    {
-		if (!FcPatternAdd (bucket->pattern, 
-				   os->objects[o], 
+		if (!FcPatternAdd (bucket->pattern,
+				   os->objects[o],
 				   FcValueCanonicalize(&v->value), defidx != idx))
 		    goto bail2;
 	    }
@@ -436,7 +436,7 @@ FcListAppend (FcListHashTable	*table,
     ++table->entries;
 
     return FcTrue;
-    
+
 bail2:
     FcPatternDestroy (bucket->pattern);
 bail1:
@@ -515,7 +515,7 @@ FcFontSetList (FcConfig	    *config,
 		full++;
 	    }
 	}
-	printf ("used: %d max: %d avg: %g\n", full, max, 
+	printf ("used: %d max: %d avg: %g\n", full, max,
 		(double) ents / FC_LIST_HASH_SIZE);
     }
 #endif
@@ -535,7 +535,7 @@ FcFontSetList (FcConfig	    *config,
 	    FcMemFree (FC_MEM_LISTBUCK, sizeof (FcListBucket));
 	    free (bucket);
 	}
-    
+
     return ret;
 
 bail2:
diff --git a/fontconfig/src/fcmatch.c b/fontconfig/src/fcmatch.c
index aa84eda83..f111be52f 100644
--- a/fontconfig/src/fcmatch.c
+++ b/fontconfig/src/fcmatch.c
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -31,7 +31,7 @@ static double
 FcCompareNumber (FcValue *value1, FcValue *value2)
 {
     double  v1, v2, v;
-    
+
     switch (value1->type) {
     case FcTypeInteger:
 	v1 = (double) value1->u.i;
@@ -67,7 +67,7 @@ FcCompareString (FcValue *v1, FcValue *v2)
 static double
 FcCompareFamily (FcValue *v1, FcValue *v2)
 {
-    /* rely on the guarantee in FcPatternAddWithBinding that
+    /* rely on the guarantee in FcPatternObjectAddWithBinding that
      * families are always FcTypeString. */
     const FcChar8* v1_string = FcValueString(v1);
     const FcChar8* v2_string = FcValueString(v2);
@@ -84,7 +84,7 @@ FcCompareLang (FcValue *v1, FcValue *v2)
 {
     FcLangResult    result;
     FcValue value1 = FcValueCanonicalize(v1), value2 = FcValueCanonicalize(v2);
-    
+
     switch (value1.type) {
     case FcTypeLangSet:
 	switch (value2.type) {
@@ -92,7 +92,7 @@ FcCompareLang (FcValue *v1, FcValue *v2)
 	    result = FcLangSetCompare (value1.u.l, value2.u.l);
 	    break;
 	case FcTypeString:
-	    result = FcLangSetHasLang (value1.u.l, 
+	    result = FcLangSetHasLang (value1.u.l,
 				       value2.u.s);
 	    break;
 	default:
@@ -105,7 +105,7 @@ FcCompareLang (FcValue *v1, FcValue *v2)
 	    result = FcLangSetHasLang (value2.u.l, value1.u.s);
 	    break;
 	case FcTypeString:
-	    result = FcLangCompare (value1.u.s, 
+	    result = FcLangCompare (value1.u.s,
 				    value2.u.s);
 	    break;
 	default:
@@ -354,10 +354,10 @@ FcCompare (FcPattern	*pat,
 	   FcResult	*result)
 {
     int		    i, i1, i2;
-    
+
     for (i = 0; i < NUM_MATCH_VALUES; i++)
 	value[i] = 0.0;
-    
+
     i1 = 0;
     i2 = 0;
     while (i1 < pat->num && i2 < fnt->num)
@@ -394,7 +394,7 @@ FcFontRenderPrepare (FcConfig	    *config,
     FcPatternElt    *fe, *pe;
     FcValue	    v;
     FcResult	    result;
-    
+
     new = FcPatternCreate ();
     if (!new)
 	return 0;
@@ -404,7 +404,7 @@ FcFontRenderPrepare (FcConfig	    *config,
 	pe = FcPatternObjectFindElt (pat, fe->object);
 	if (pe)
 	{
-	    if (!FcCompareValueList (pe->object, FcPatternEltValues(pe), 
+	    if (!FcCompareValueList (pe->object, FcPatternEltValues(pe),
 				     FcPatternEltValues(fe), &v, 0, &result))
 	    {
 		FcPatternDestroy (new);
@@ -529,7 +529,7 @@ FcFontSetMatch (FcConfig    *config,
 
 FcPattern *
 FcFontMatch (FcConfig	*config,
-	     FcPattern	*p, 
+	     FcPattern	*p,
 	     FcResult	*result)
 {
     FcFontSet	*sets[2];
@@ -687,21 +687,21 @@ FcFontSetSort (FcConfig	    *config,
     }
     if (!nnodes)
 	goto bail0;
-    
+
     for (nPatternLang = 0;
 	 FcPatternGet (p, FC_LANG, nPatternLang, &patternLang) == FcResultMatch;
 	 nPatternLang++)
 	;
 	
     /* freed below */
-    nodes = malloc (nnodes * sizeof (FcSortNode) + 
+    nodes = malloc (nnodes * sizeof (FcSortNode) +
 		    nnodes * sizeof (FcSortNode *) +
 		    nPatternLang * sizeof (FcBool));
     if (!nodes)
 	goto bail0;
     nodeps = (FcSortNode **) (nodes + nnodes);
     patternLangSat = (FcBool *) (nodeps + nnodes);
-    
+
     new = nodes;
     nodep = nodeps;
     for (set = 0; set < nsets; set++)
@@ -735,13 +735,13 @@ FcFontSetSort (FcConfig	    *config,
     }
 
     nnodes = new - nodes;
-    
+
     qsort (nodeps, nnodes, sizeof (FcSortNode *),
 	   FcSortCompare);
-    
+
     for (i = 0; i < nPatternLang; i++)
 	patternLangSat[i] = FcFalse;
-    
+
     for (f = 0; f < nnodes; f++)
     {
 	FcBool	satisfies = FcFalse;
@@ -814,7 +814,7 @@ bail0:
 
 FcFontSet *
 FcFontSort (FcConfig	*config,
-	    FcPattern	*p, 
+	    FcPattern	*p,
 	    FcBool	trim,
 	    FcCharSet	**csp,
 	    FcResult	*result)
diff --git a/fontconfig/src/fcname.c b/fontconfig/src/fcname.c
index b4ce94421..86c10b65e 100644
--- a/fontconfig/src/fcname.c
+++ b/fontconfig/src/fcname.c
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -28,9 +28,9 @@
 #include <string.h>
 #include <stdio.h>
 
-/* 
+/*
  * Please do not change this list, it is used to initialize the object
- * list in this order to match the FC_foo_OBJECT constants. Those 
+ * list in this order to match the FC_foo_OBJECT constants. Those
  * constants are written into cache files.
  */
 
@@ -169,7 +169,7 @@ FcObjectFindByName (const char *object, FcBool insert)
      * Hook it into the hash chain
      */
     b = malloc (sizeof(FcObjectBucket));
-    if (!b) 
+    if (!b)
 	return NULL;
     object = (const char *) FcStrCopy ((FcChar8 *) object);
     if (!object) {
@@ -212,7 +212,7 @@ FcObjectHashInsert (const FcObjectType *object, FcBool copy)
      * Hook it into the hash chain
      */
     b = malloc (sizeof(FcObjectBucket));
-    if (!b) 
+    if (!b)
 	return FcFalse;
     if (copy)
     {
@@ -421,7 +421,7 @@ static const FcConstant _FcBaseConstants[] = {
     { (FcChar8 *) "expanded",	    "width",	FC_WIDTH_EXPANDED },
     { (FcChar8 *) "extraexpanded",  "width",	FC_WIDTH_EXTRAEXPANDED },
     { (FcChar8 *) "ultraexpanded",  "width",	FC_WIDTH_ULTRAEXPANDED },
-    
+
     { (FcChar8 *) "proportional",   "spacing",  FC_PROPORTIONAL, },
     { (FcChar8 *) "dual",	    "spacing",  FC_DUAL, },
     { (FcChar8 *) "mono",	    "spacing",  FC_MONO, },
@@ -495,8 +495,8 @@ FcNameUnregisterConstants (const FcConstant *consts, int nconsts)
 {
     const FcConstantList	*l, **prev;
 
-    for (prev = &_FcConstants; 
-	 (l = *prev); 
+    for (prev = &_FcConstants;
+	 (l = *prev);
 	 prev = (const FcConstantList **) &(l->next))
     {
 	if (l->consts == consts && l->nconsts == nconsts)
@@ -620,7 +620,7 @@ static const FcChar8 *
 FcNameFindNext (const FcChar8 *cur, const char *delim, FcChar8 *save, FcChar8 *last)
 {
     FcChar8    c;
-    
+
     while ((c = *cur))
     {
 	if (c == '\\')
@@ -765,7 +765,7 @@ bail0:
     return 0;
 }
 static FcBool
-FcNameUnparseString (FcStrBuf	    *buf, 
+FcNameUnparseString (FcStrBuf	    *buf,
 		     const FcChar8  *string,
 		     const FcChar8  *escape)
 {
@@ -790,7 +790,7 @@ FcNameUnparseValue (FcStrBuf	*buf,
 {
     FcChar8	temp[1024];
     FcValue v = FcValueCanonicalize(v0);
-    
+
     switch (v.type) {
     case FcTypeVoid:
 	return FcTrue;
@@ -805,7 +805,7 @@ FcNameUnparseValue (FcStrBuf	*buf,
     case FcTypeBool:
 	return FcNameUnparseString (buf, v.u.b ? (FcChar8 *) "True" : (FcChar8 *) "False", 0);
     case FcTypeMatrix:
-	sprintf ((char *) temp, "%g %g %g %g", 
+	sprintf ((char *) temp, "%g %g %g %g",
 		 v.u.m->xx, v.u.m->xy, v.u.m->yx, v.u.m->yy);
 	return FcNameUnparseString (buf, temp, 0);
     case FcTypeCharSet:
@@ -873,11 +873,11 @@ FcNameUnparseEscaped (FcPattern *pat, FcBool escape)
 	for (i = 0; i < l->ntypes; i++)
 	{
 	    o = &l->types[i];
-	    if (!strcmp (o->object, FC_FAMILY) || 
+	    if (!strcmp (o->object, FC_FAMILY) ||
 		!strcmp (o->object, FC_SIZE) ||
 		!strcmp (o->object, FC_FILE))
 		continue;
-	    
+	
 	    e = FcPatternObjectFindElt (pat, FcObjectFromName (o->object));
 	    if (e)
 	    {
@@ -887,7 +887,7 @@ FcNameUnparseEscaped (FcPattern *pat, FcBool escape)
 		    goto bail0;
 		if (!FcNameUnparseString (&buf, (FcChar8 *) "=", 0))
 		    goto bail0;
-		if (!FcNameUnparseValueList (&buf, FcPatternEltValues(e), escape ? 
+		if (!FcNameUnparseValueList (&buf, FcPatternEltValues(e), escape ?
 					     (FcChar8 *) FC_ESCAPE_VARIABLE : 0))
 		    goto bail0;
 	    }
diff --git a/fontconfig/src/fcpat.c b/fontconfig/src/fcpat.c
index 76263b655..be01a4fd2 100644
--- a/fontconfig/src/fcpat.c
+++ b/fontconfig/src/fcpat.c
@@ -5,9 +5,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -138,11 +138,11 @@ FcValueListDestroy (FcValueListPtr l)
 	    FcMatrixFree ((FcMatrix *)l->value.u.m);
 	    break;
 	case FcTypeCharSet:
-	    FcCharSetDestroy 
+	    FcCharSetDestroy
 		((FcCharSet *) (l->value.u.c));
 	    break;
 	case FcTypeLangSet:
-	    FcLangSetDestroy 
+	    FcLangSetDestroy
 		((FcLangSet *) (l->value.u.l));
 	    break;
 	default:
@@ -210,7 +210,7 @@ FcStringHash (const FcChar8 *s)
 {
     FcChar8	c;
     FcChar32	h = 0;
-    
+
     if (s)
 	while ((c = *s++))
 	    h = ((h << 1) | (h >> 31)) ^ c;
@@ -232,9 +232,9 @@ FcValueHash (const FcValue *v)
     case FcTypeBool:
 	return (FcChar32) v->u.b;
     case FcTypeMatrix:
-	return (FcDoubleHash (v->u.m->xx) ^ 
-		FcDoubleHash (v->u.m->xy) ^ 
-		FcDoubleHash (v->u.m->yx) ^ 
+	return (FcDoubleHash (v->u.m->xx) ^
+		FcDoubleHash (v->u.m->xy) ^
+		FcDoubleHash (v->u.m->yx) ^
 		FcDoubleHash (v->u.m->yy));
     case FcTypeCharSet:
 	return (FcChar32) FcValueCharSet(v)->num;
@@ -269,7 +269,7 @@ static FcChar32
 FcValueListHash (FcValueListPtr l)
 {
     FcChar32	hash = 0;
-    
+
     for (; l; l = FcValueListNext(l))
     {
 	hash = ((hash << 1) | (hash >> 31)) ^ FcValueHash (&l->value);
@@ -282,7 +282,7 @@ FcPatternDestroy (FcPattern *p)
 {
     int		    i;
     FcPatternElt    *elts;
-    
+
     if (p->ref == FC_REF_CONSTANT)
     {
 	FcCacheObjectDereference (p);
@@ -342,12 +342,12 @@ FcPatternObjectInsertElt (FcPattern *p, FcObject object)
 {
     int		    i;
     FcPatternElt   *e;
-    
+
     i = FcPatternObjectPosition (p, object);
     if (i < 0)
     {
 	i = -i - 1;
-    
+
 	/* reallocate array */
 	if (p->num + 1 >= p->size)
 	{
@@ -385,14 +385,14 @@ FcPatternObjectInsertElt (FcPattern *p, FcObject object)
 		 e + i,
 		 sizeof (FcPatternElt) *
 		 (p->num - i));
-		 
+		
 	/* bump count */
 	p->num++;
 	
 	e[i].object = object;
 	e[i].values = NULL;
     }
-    
+
     return FcPatternElts(p) + i;
 }
 
@@ -429,7 +429,7 @@ FcPatternHash (const FcPattern *p)
 
     for (i = 0; i < p->num; i++)
     {
-	h = (((h << 1) | (h >> 31)) ^ 
+	h = (((h << 1) | (h >> 31)) ^
 	     pe[i].object ^
 	     FcValueListHash (FcPatternEltValues(&pe[i])));
     }
@@ -441,7 +441,7 @@ FcPatternEqualSubset (const FcPattern *pai, const FcPattern *pbi, const FcObject
 {
     FcPatternElt    *ea, *eb;
     int		    i;
-    
+
     for (i = 0; i < os->nobject; i++)
     {
 	FcObject    object = FcObjectFromName (os->objects[i]);
@@ -503,11 +503,11 @@ FcPatternObjectAddWithBinding  (FcPattern	*p,
     new->value = value;
     new->binding = binding;
     new->next = NULL;
-    
+
     e = FcPatternObjectInsertElt (p, object);
     if (!e)
 	goto bail2;
-    
+
     if (append)
     {
 	for (prev = &e->values; *prev; prev = &(*prev)->next)
@@ -519,10 +519,10 @@ FcPatternObjectAddWithBinding  (FcPattern	*p,
 	new->next = e->values;
 	e->values = new;
     }
-    
+
     return FcTrue;
 
-bail2:    
+bail2:
     FcValueDestroy (value);
 bail1:
     FcMemFree (FC_MEM_VALLIST, sizeof (FcValueList));
@@ -563,10 +563,10 @@ FcPatternObjectDel (FcPattern *p, FcObject object)
 
     /* destroy value */
     FcValueListDestroy (e->values);
-    
+
     /* shuffle existing ones down */
-    memmove (e, e+1, 
-	     (FcPatternElts(p) + p->num - (e + 1)) * 
+    memmove (e, e+1,
+	     (FcPatternElts(p) + p->num - (e + 1)) *
 	     sizeof (FcPatternElt));
     p->num--;
     e = FcPatternElts(p) + p->num;
@@ -580,7 +580,7 @@ FcPatternDel (FcPattern *p, const char *object)
 {
     return FcPatternObjectDel (p, FcObjectFromName (object));
 }
-    
+
 FcBool
 FcPatternRemove (FcPattern *p, const char *object, int id)
 {
@@ -773,8 +773,8 @@ FcPatternGetInteger (const FcPattern *p, const char *object, int id, int *i)
 {
     return FcPatternObjectGetInteger (p, FcObjectFromName (object), id, i);
 }
-    
-    
+
+
 FcResult
 FcPatternObjectGetDouble (const FcPattern *p, FcObject object, int id, double *d)
 {
@@ -824,7 +824,7 @@ FcPatternGetString (const FcPattern *p, const char *object, int id, FcChar8 ** s
 {
     return FcPatternObjectGetString (p, FcObjectFromName (object), id, s);
 }
-    
+
 FcResult
 FcPatternGetMatrix(const FcPattern *p, const char *object, int id, FcMatrix **m)
 {
@@ -924,7 +924,7 @@ FcPatternDuplicate (const FcPattern *orig)
 						l->binding,
 						FcTrue))
 		goto bail1;
-	    
+	
 	}
     }
 
@@ -949,7 +949,7 @@ FcPattern *
 FcPatternVaBuild (FcPattern *p, va_list va)
 {
     FcPattern	*ret;
-    
+
     FcPatternVapBuild (ret, p, va);
     return ret;
 }
@@ -958,7 +958,7 @@ FcPattern *
 FcPatternBuild (FcPattern *p, ...)
 {
     va_list	va;
-    
+
     va_start (va, p);
     FcPatternVapBuild (p, p, va);
     va_end (va);
@@ -974,14 +974,14 @@ FcPatternAppend (FcPattern *p, FcPattern *s)
     int		    i;
     FcPatternElt    *e;
     FcValueListPtr  v;
-    
+
     for (i = 0; i < s->num; i++)
     {
 	e = FcPatternElts(s)+i;
 	for (v = FcPatternEltValues(e); v; v = FcValueListNext(v))
 	{
 	    if (!FcPatternObjectAddWithBinding (p, e->object,
-						FcValueCanonicalize(&v->value), 
+						FcValueCanonicalize(&v->value),
 						v->binding, FcTrue))
 		return FcFalse;
 	}
@@ -1102,7 +1102,7 @@ FcPatternSerializeAlloc (FcSerialize *serialize, const FcPattern *pat)
 {
     int	i;
     FcPatternElt    *elts = FcPatternElts(pat);
-    
+
     if (!FcSerializeAlloc (serialize, pat, sizeof (FcPattern)))
 	return FcFalse;
     if (!FcSerializeAlloc (serialize, elts, pat->num * sizeof (FcPatternElt)))
@@ -1128,11 +1128,11 @@ FcPatternSerialize (FcSerialize *serialize, const FcPattern *pat)
     *pat_serialized = *pat;
     pat_serialized->size = pat->num;
     pat_serialized->ref = FC_REF_CONSTANT;
-    
+
     elts_serialized = FcSerializePtr (serialize, elts);
     if (!elts_serialized)
 	return NULL;
-    
+
     pat_serialized->elts_offset = FcPtrToOffset (pat_serialized,
 						 elts_serialized);
 
@@ -1142,7 +1142,7 @@ FcPatternSerialize (FcSerialize *serialize, const FcPattern *pat)
 	if (!values_serialized)
 	    return NULL;
 	elts_serialized[i].object = elts[i].object;
-	elts_serialized[i].values = FcPtrToEncodedOffset (&elts_serialized[i], 
+	elts_serialized[i].values = FcPtrToEncodedOffset (&elts_serialized[i],
 							  values_serialized,
 							  FcValueList);
     }
@@ -1199,7 +1199,7 @@ FcValueListSerialize (FcSerialize *serialize, const FcValueList *vl)
 	vl_serialized = FcSerializePtr (serialize, vl);
 	if (!vl_serialized)
 	    return NULL;
-    
+
 	if (prev_serialized)
 	    prev_serialized->next = FcPtrToEncodedOffset (prev_serialized,
 							  vl_serialized,
diff --git a/fontconfig/src/fcstr.c b/fontconfig/src/fcstr.c
index ea7c376c2..8b94ecba5 100644
--- a/fontconfig/src/fcstr.c
+++ b/fontconfig/src/fcstr.c
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -109,7 +109,7 @@ FcStrCaseWalkerLong (FcCaseWalker *w, FcChar8 r)
 	    int		mid = (min + max) >> 1;
 	    FcChar32    low = fcCaseFold[mid].upper;
 	    FcChar32    high = low + FcCaseFoldUpperCount (&fcCaseFold[mid]);
-	    
+	
 	    if (high <= ucs4)
 		min = mid + 1;
 	    else if (ucs4 < low)
@@ -158,7 +158,7 @@ FcStrCaseWalkerNext (FcCaseWalker *w)
 	w->read = 0;
     }
     r = *w->src++;
-    
+
     if ((r & 0xc0) == 0xc0)
 	return FcStrCaseWalkerLong (w, r);
     if ('A' <= r && r <= 'Z')
@@ -181,7 +181,7 @@ FcStrCaseWalkerNextIgnoreBlanks (FcCaseWalker *w)
     {
 	r = *w->src++;
     } while (r == ' ');
-    
+
     if ((r & 0xc0) == 0xc0)
 	return FcStrCaseWalkerLong (w, r);
     if ('A' <= r && r <= 'Z')
@@ -215,11 +215,11 @@ FcStrCmpIgnoreCase (const FcChar8 *s1, const FcChar8 *s2)
     FcChar8	    c1, c2;
 
     if (s1 == s2) return 0;
-    
+
     FcStrCaseWalkerInit (s1, &w1);
     FcStrCaseWalkerInit (s2, &w2);
-    
-    for (;;) 
+
+    for (;;)
     {
 	c1 = FcStrCaseWalkerNext (&w1);
 	c2 = FcStrCaseWalkerNext (&w2);
@@ -236,11 +236,11 @@ FcStrCmpIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2)
     FcChar8	    c1, c2;
 
     if (s1 == s2) return 0;
-    
+
     FcStrCaseWalkerInit (s1, &w1);
     FcStrCaseWalkerInit (s2, &w2);
-    
-    for (;;) 
+
+    for (;;)
     {
 	c1 = FcStrCaseWalkerNextIgnoreBlanks (&w1);
 	c2 = FcStrCaseWalkerNextIgnoreBlanks (&w2);
@@ -254,10 +254,10 @@ int
 FcStrCmp (const FcChar8 *s1, const FcChar8 *s2)
 {
     FcChar8 c1, c2;
-    
+
     if (s1 == s2)
 	return 0;
-    for (;;) 
+    for (;;)
     {
 	c1 = *s1++;
 	c2 = *s2++;
@@ -296,8 +296,8 @@ FcStrIsAtIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2)
 
     FcStrCaseWalkerInit (s1, &w1);
     FcStrCaseWalkerInit (s2, &w2);
-    
-    for (;;) 
+
+    for (;;)
     {
 	c1 = FcStrCaseWalkerNextIgnoreBlanks (&w1);
 	c2 = FcStrCaseWalkerNextIgnoreBlanks (&w2);
@@ -355,8 +355,8 @@ FcStrIsAtIgnoreCase (const FcChar8 *s1, const FcChar8 *s2)
 
     FcStrCaseWalkerInit (s1, &w1);
     FcStrCaseWalkerInit (s2, &w2);
-    
-    for (;;) 
+
+    for (;;)
     {
 	c1 = FcStrCaseWalkerNext (&w1);
 	c2 = FcStrCaseWalkerNext (&w2);
@@ -395,7 +395,7 @@ FcStrContainsWord (const FcChar8 *s1, const FcChar8 *s2)
 	
     while (s1len >= s2len)
     {
-	if (wordStart && 
+	if (wordStart &&
 	    FcStrIsAtIgnoreCase (s1, s2) &&
 	    (s1len == s2len || FcCharIsPunct (s1[s2len])))
 	{
@@ -422,12 +422,12 @@ FcStrStrIgnoreCase (const FcChar8 *s1, const FcChar8 *s2)
 
     if (s1 == s2)
 	return s1;
-    
+
     FcStrCaseWalkerInit (s1, &w1);
     FcStrCaseWalkerInit (s2, &w2);
-    
+
     c2 = FcStrCaseWalkerNext (&w2);
-    
+
     for (;;)
     {
 	cur = w1.src;
@@ -474,7 +474,7 @@ again:
     if (!c2)
 	return 0;
 
-    for (;;) 
+    for (;;)
     {
 	p = s1;
 	c1 = *s1++;
@@ -517,15 +517,15 @@ FcUtf8ToUcs4 (const FcChar8 *src_orig,
 
     if (len == 0)
 	return 0;
-    
+
     s = *src++;
     len--;
-    
+
     if (!(s & 0x80))
     {
 	result = s;
 	extra = 0;
-    } 
+    }
     else if (!(s & 0x40))
     {
 	return -1;
@@ -561,7 +561,7 @@ FcUtf8ToUcs4 (const FcChar8 *src_orig,
     }
     if (extra > len)
 	return -1;
-    
+
     while (extra--)
     {
 	result <<= 6;
@@ -586,7 +586,7 @@ FcUtf8Len (const FcChar8    *string,
     int		clen;
     FcChar32	c;
     FcChar32	max;
-    
+
     n = 0;
     max = 0;
     while (len)
@@ -616,7 +616,7 @@ FcUcs4ToUtf8 (FcChar32	ucs4,
 {
     int	bits;
     FcChar8 *d = dest;
-    
+
     if      (ucs4 <       0x80) {  *d++=  ucs4;                         bits= -6; }
     else if (ucs4 <      0x800) {  *d++= ((ucs4 >>  6) & 0x1F) | 0xC0;  bits=  0; }
     else if (ucs4 <    0x10000) {  *d++= ((ucs4 >> 12) & 0x0F) | 0xE0;  bits=  6; }
@@ -647,11 +647,11 @@ FcUtf16ToUcs4 (const FcChar8	*src_orig,
 
     if (len < 2)
 	return 0;
-    
+
     a = GetUtf16 (src, endian); src += 2; len -= 2;
-    
-    /* 
-     * Check for surrogate 
+
+    /*
+     * Check for surrogate
      */
     if ((a & 0xfc00) == 0xd800)
     {
@@ -683,7 +683,7 @@ FcUtf16Len (const FcChar8   *string,
     int		clen;
     FcChar32	c;
     FcChar32	max;
-    
+
     n = 0;
     max = 0;
     while (len)
@@ -835,7 +835,7 @@ FcChar8 *
 FcStrCopyFilename (const FcChar8 *s)
 {
     FcChar8 *new;
-    
+
     if (*s == '~')
     {
 	FcChar8	*home = FcConfigHome ();
@@ -875,7 +875,7 @@ FcStrLastSlash (const FcChar8  *path)
 
     return slash;
 }
-  
+
 FcChar8 *
 FcStrDirname (const FcChar8 *file)
 {
@@ -954,10 +954,10 @@ FcStrCanonAbsoluteFilename (const FcChar8 *s)
     }
     return file;
 }
- 
+
 #ifdef _WIN32
 /*
- * Convert '\\' to '/' , remove double '/' 
+ * Convert '\\' to '/' , remove double '/'
  */
 static void
 FcConvertDosPath (char *str)
@@ -1135,7 +1135,7 @@ FcStrSetDel (FcStrSet *set, const FcChar8 *s)
 	     * copy remaining string pointers and trailing
 	     * NULL
 	     */
-	    memmove (&set->strs[i], &set->strs[i+1], 
+	    memmove (&set->strs[i], &set->strs[i+1],
 		     (set->num - i) * sizeof (FcChar8 *));
 	    set->num--;
 	    return FcTrue;
@@ -1149,7 +1149,7 @@ FcStrSetDestroy (FcStrSet *set)
     if (--set->ref == 0)
     {
 	int	i;
-    
+
 	for (i = 0; i < set->num; i++)
 	    FcStrFree (set->strs[i]);
 	if (set->strs)
diff --git a/fontconfig/src/fcxml.c b/fontconfig/src/fcxml.c
index 9428468a4..ff30b7bbd 100644
--- a/fontconfig/src/fcxml.c
+++ b/fontconfig/src/fcxml.c
@@ -7,9 +7,9 @@
  * 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
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -133,6 +133,30 @@ FcExprCreateBool (FcConfig *config, FcBool b)
     return e;
 }
 
+static FcExpr *
+FcExprCreateCharSet (FcConfig *config, FcCharSet *charset)
+{
+    FcExpr *e = FcConfigAllocExpr (config);
+    if (e)
+    {
+	e->op = FcOpCharSet;
+	e->u.cval = FcCharSetCopy (charset);
+    }
+    return e;
+}
+
+static FcExpr *
+FcExprCreateLangSet (FcConfig *config, FcLangSet *langset)
+{
+    FcExpr *e = FcConfigAllocExpr (config);
+    if (e)
+    {
+	e->op = FcOpLangSet;
+	e->u.lval = FcLangSetCopy (langset);
+    }
+    return e;
+}
+
 static FcExpr *
 FcExprCreateField (FcConfig *config, const char *field)
 {
@@ -185,9 +209,14 @@ FcExprDestroy (FcExpr *e)
     case FcOpMatrix:
 	FcMatrixFree (e->u.mval);
 	break;
+    case FcOpRange:
+	break;
     case FcOpCharSet:
 	FcCharSetDestroy (e->u.cval);
 	break;
+    case FcOpLangSet:
+	FcLangSetDestroy (e->u.lval);
+	break;
     case FcOpBool:
 	break;
     case FcOpField:
@@ -277,8 +306,10 @@ typedef enum _FcElement {
     FcElementDouble,
     FcElementString,
     FcElementMatrix,
+    FcElementRange,
     FcElementBool,
-    FcElementCharset,
+    FcElementCharSet,
+    FcElementLangSet,
     FcElementName,
     FcElementConst,
     FcElementOr,
@@ -316,7 +347,7 @@ static const struct {
     { "config",		FcElementConfig },
     { "match",		FcElementMatch },
     { "alias",		FcElementAlias },
-    
+
     { "blank",		FcElementBlank },
     { "rescan",		FcElementRescan },
 
@@ -338,8 +369,10 @@ static const struct {
     { "double",		FcElementDouble },
     { "string",		FcElementString },
     { "matrix",		FcElementMatrix },
+    { "range",		FcElementRange },
     { "bool",		FcElementBool },
-    { "charset",	FcElementCharset },
+    { "charset",	FcElementCharSet },
+    { "langset",	FcElementLangSet },
     { "name",		FcElementName },
     { "const",		FcElementConst },
     { "or",		FcElementOr },
@@ -383,7 +416,7 @@ typedef struct _FcPStack {
     FcStrBuf		str;
     FcChar8            *attr_buf_static[16];
 } FcPStack;
-    
+
 typedef enum _FcVStackTag {
     FcVStackNone,
 
@@ -393,16 +426,19 @@ typedef enum _FcVStackTag {
     FcVStackConstant,
     FcVStackGlob,
     FcVStackPattern,
-    
+
     FcVStackPrefer,
     FcVStackAccept,
     FcVStackDefault,
-    
+
     FcVStackInteger,
     FcVStackDouble,
     FcVStackMatrix,
+    FcVStackRange,
     FcVStackBool,
-    
+    FcVStackCharSet,
+    FcVStackLangSet,
+
     FcVStackTest,
     FcVStackExpr,
     FcVStackEdit
@@ -418,7 +454,10 @@ typedef struct _FcVStack {
 	int		integer;
 	double		_double;
 	FcMatrix	*matrix;
+	FcRange		range;
 	FcBool		bool_;
+	FcCharSet	*charset;
+	FcLangSet	*langset;
 
 	FcTest		*test;
 	FcQual		qual;
@@ -529,7 +568,7 @@ FcTypecheckExpr (FcConfigParse *parse, FcExpr *expr, FcType type)
 {
     const FcObjectType	*o;
     const FcConstant	*c;
-    
+
     /* If parsing the expression failed, some nodes may be NULL */
     if (!expr)
 	return;
@@ -551,6 +590,9 @@ FcTypecheckExpr (FcConfigParse *parse, FcExpr *expr, FcType type)
     case FcOpCharSet:
 	FcTypecheckValue (parse, FcTypeCharSet, type);
 	break;
+    case FcOpLangSet:
+	FcTypecheckValue (parse, FcTypeLangSet, type);
+	break;
     case FcOpNil:
 	break;
     case FcOpField:
@@ -566,8 +608,8 @@ FcTypecheckExpr (FcConfigParse *parse, FcExpr *expr, FcType type)
 	    if (o)
 		FcTypecheckValue (parse, o->type, type);
 	}
-        else 
-            FcConfigMessage (parse, FcSevereWarning, 
+        else
+            FcConfigMessage (parse, FcSevereWarning,
                              "invalid constant used : %s",
                              expr->u.constant);
 	break;
@@ -618,7 +660,7 @@ FcTypecheckExpr (FcConfigParse *parse, FcExpr *expr, FcType type)
 
 static FcTest *
 FcTestCreate (FcConfigParse *parse,
-	      FcMatchKind   kind, 
+	      FcMatchKind   kind,
 	      FcQual	    qual,
 	      const FcChar8 *field,
 	      FcOp	    compare,
@@ -741,6 +783,18 @@ FcVStackPushMatrix (FcConfigParse *parse, FcMatrix *matrix)
     return FcTrue;
 }
 
+static FcBool
+FcVStackPushRange (FcConfigParse *parse, FcRange *range)
+{
+    FcVStack	*vstack = FcVStackCreateAndPush (parse);
+    if (!vstack)
+	return FcFalse;
+    vstack->u.range.begin = range->begin;
+    vstack->u.range.end = range->end;
+    vstack->tag = FcVStackRange;
+    return FcTrue;
+}
+
 static FcBool
 FcVStackPushBool (FcConfigParse *parse, FcBool bool_)
 {
@@ -752,6 +806,34 @@ FcVStackPushBool (FcConfigParse *parse, FcBool bool_)
     return FcTrue;
 }
 
+static FcBool
+FcVStackPushCharSet (FcConfigParse *parse, FcCharSet *charset)
+{
+    FcVStack	*vstack;
+    if (!charset)
+	return FcFalse;
+    vstack = FcVStackCreateAndPush (parse);
+    if (!vstack)
+	return FcFalse;
+    vstack->u.charset = charset;
+    vstack->tag = FcVStackCharSet;
+    return FcTrue;
+}
+
+static FcBool
+FcVStackPushLangSet (FcConfigParse *parse, FcLangSet *langset)
+{
+    FcVStack	*vstack;
+    if (!langset)
+	return FcFalse;
+    vstack = FcVStackCreateAndPush (parse);
+    if (!vstack)
+	return FcFalse;
+    vstack->u.langset = langset;
+    vstack->tag = FcVStackLangSet;
+    return FcTrue;
+}
+
 static FcBool
 FcVStackPushTest (FcConfigParse *parse, FcTest *test)
 {
@@ -817,7 +899,7 @@ static void
 FcVStackPopAndDestroy (FcConfigParse *parse)
 {
     FcVStack	*vstack = parse->vstack;
-    
+
     if (!vstack || vstack->pstack != parse->pstack)
 	return;
 
@@ -843,8 +925,15 @@ FcVStackPopAndDestroy (FcConfigParse *parse)
     case FcVStackMatrix:
 	FcMatrixFree (vstack->u.matrix);
 	break;
+    case FcVStackRange:
     case FcVStackBool:
 	break;
+    case FcVStackCharSet:
+	FcCharSetDestroy (vstack->u.charset);
+	break;
+    case FcVStackLangSet:
+	FcLangSetDestroy (vstack->u.langset);
+	break;
     case FcVStackTest:
 	FcTestDestroy (vstack->u.test);
 	break;
@@ -954,8 +1043,8 @@ static FcBool
 FcPStackPop (FcConfigParse *parse)
 {
     FcPStack   *old;
-    
-    if (!parse->pstack) 
+
+    if (!parse->pstack)
     {
 	FcConfigMessage (parse, FcSevereError, "mismatching element");
 	return FcFalse;
@@ -1026,11 +1115,11 @@ FcStartElement(void *userData, const XML_Char *name, const XML_Char **attr)
 {
     FcConfigParse   *parse = userData;
     FcElement	    element;
-    
+
     element = FcElementMap (name);
     if (element == FcElementUnknown)
 	FcConfigMessage (parse, FcSevereWarning, "unknown element \"%s\"", name);
-    
+
     if (!FcPStackPush (parse, element, attr))
     {
 	FcConfigMessage (parse, FcSevereError, "out of memory");
@@ -1042,30 +1131,40 @@ FcStartElement(void *userData, const XML_Char *name, const XML_Char **attr)
 static void
 FcParseBlank (FcConfigParse *parse)
 {
-    int	    n = FcVStackElements (parse);
+    int		n = FcVStackElements (parse);
+    FcChar32	i;
     while (n-- > 0)
     {
 	FcVStack    *v = FcVStackFetch (parse, n);
-	if (v->tag != FcVStackInteger)
-	    FcConfigMessage (parse, FcSevereError, "non-integer blank");
-	else
+	if (!parse->config->blanks)
 	{
+	    parse->config->blanks = FcBlanksCreate ();
 	    if (!parse->config->blanks)
-	    {
-		parse->config->blanks = FcBlanksCreate ();
-		if (!parse->config->blanks)
-		{
-		    FcConfigMessage (parse, FcSevereError, "out of memory");
-		    break;
-		}
-	    }
+		goto bail;
+	}
+	switch (v->tag) {
+	case FcVStackInteger:
 	    if (!FcBlanksAdd (parse->config->blanks, v->u.integer))
+		goto bail;
+	    break;
+	case FcVStackRange:
+	    if (v->u.range.begin <= v->u.range.end)
 	    {
-		FcConfigMessage (parse, FcSevereError, "out of memory");
-		break;
+	      for (i = v->u.range.begin; i <= v->u.range.end; i++)
+	      {
+		  if (!FcBlanksAdd (parse->config->blanks, i))
+		      goto bail;
+	      }
 	    }
+	    break;
+	default:
+	    FcConfigMessage (parse, FcSevereError, "invalid element in blank");
+	    break;
 	}
     }
+    return;
+  bail:
+    FcConfigMessage (parse, FcSevereError, "out of memory");
 }
 
 static void
@@ -1087,7 +1186,7 @@ FcParseInt (FcConfigParse *parse)
 {
     FcChar8 *s, *end;
     int	    l;
-    
+
     if (!parse->pstack)
 	return;
     s = FcStrBufDoneStatic (&parse->pstack->str);
@@ -1106,13 +1205,13 @@ FcParseInt (FcConfigParse *parse)
 }
 
 /*
- * idea copied from glib g_ascii_strtod with 
- * permission of the author (Alexander Larsson) 
+ * idea copied from glib g_ascii_strtod with
+ * permission of the author (Alexander Larsson)
  */
 
 #include <locale.h>
 
-static double 
+static double
 FcStrtod (char *s, char **end)
 {
     struct lconv    *locale_data;
@@ -1168,7 +1267,7 @@ FcParseDouble (FcConfigParse *parse)
 {
     FcChar8 *s, *end;
     double  d;
-    
+
     if (!parse->pstack)
 	return;
     s = FcStrBufDoneStatic (&parse->pstack->str);
@@ -1190,7 +1289,7 @@ static void
 FcParseString (FcConfigParse *parse, FcVStackTag tag)
 {
     FcChar8 *s;
-    
+
     if (!parse->pstack)
 	return;
     s = FcStrBufDone (&parse->pstack->str);
@@ -1209,7 +1308,7 @@ FcParseMatrix (FcConfigParse *parse)
     FcVStack	*vstack;
     enum { m_done, m_xx, m_xy, m_yx, m_yy } matrix_state = m_yy;
     FcMatrix	m;
-    
+
     while ((vstack = FcVStackPeek (parse)))
     {
 	double	v;
@@ -1241,6 +1340,49 @@ FcParseMatrix (FcConfigParse *parse)
 	FcVStackPushMatrix (parse, &m);
 }
 
+static void
+FcParseRange (FcConfigParse *parse)
+{
+    FcVStack	*vstack;
+    FcRange	r;
+    FcChar32	n;
+    int		count = 1;
+
+    while ((vstack = FcVStackPeek (parse)))
+    {
+	if (count < 0)
+	{
+	    FcConfigMessage (parse, FcSevereError, "too many elements in range");
+	    return;
+	}
+	switch (vstack->tag) {
+	case FcVStackInteger:
+	    n = vstack->u.integer;
+	    break;
+	default:
+	    FcConfigMessage (parse, FcSevereError, "invalid element in range");
+	    break;
+	}
+	if (count == 1)
+	    r.end = n;
+	else
+	    r.begin = n;
+	count--;
+	FcVStackPopAndDestroy (parse);
+    }
+    if (count < 0)
+    {
+	if (r.begin > r.end)
+	{
+	    FcConfigMessage (parse, FcSevereError, "invalid range");
+	    return;
+	}
+	FcVStackPushRange (parse, &r);
+    }
+    else
+	FcConfigMessage (parse, FcSevereError, "invalid range");
+}
+
 static FcBool
 FcConfigLexBool (FcConfigParse *parse, const FcChar8 *bool_)
 {
@@ -1269,13 +1411,88 @@ FcParseBool (FcConfigParse *parse)
     FcStrBufDestroy (&parse->pstack->str);
 }
 
+static void
+FcParseCharSet (FcConfigParse *parse)
+{
+    FcVStack	*vstack;
+    FcCharSet	*charset = FcCharSetCreate ();
+    FcChar32	i;
+    int n = 0;
+
+    while ((vstack = FcVStackPeek (parse)))
+    {
+	switch (vstack->tag) {
+	case FcVStackInteger:
+	    if (!FcCharSetAddChar (charset, vstack->u.integer))
+	    {
+		FcConfigMessage (parse, FcSevereWarning, "invalid character: 0x%04x", vstack->u.integer);
+	    }
+	    else
+		n++;
+	    break;
+	case FcVStackRange:
+	    if (vstack->u.range.begin <= vstack->u.range.end)
+	    {
+	      for (i = vstack->u.range.begin; i <= vstack->u.range.end; i++)
+	      {
+		  if (!FcCharSetAddChar (charset, i))
+		  {
+		      FcConfigMessage (parse, FcSevereWarning, "invalid character: 0x%04x", i);
+		  }
+		  else
+		      n++;
+	      }
+	    }
+	    break;
+	default:
+		FcConfigMessage (parse, FcSevereError, "invalid element in charset");
+		break;
+	}
+	FcVStackPopAndDestroy (parse);
+    }
+    if (n > 0)
+	    FcVStackPushCharSet (parse, charset);
+    else
+	    FcCharSetDestroy (charset);
+}
+
+static void
+FcParseLangSet (FcConfigParse *parse)
+{
+    FcVStack	*vstack;
+    FcLangSet	*langset = FcLangSetCreate ();
+    int n = 0;
+
+    while ((vstack = FcVStackPeek (parse)))
+    {
+	switch (vstack->tag) {
+	case FcVStackString:
+	    if (!FcLangSetAdd (langset, vstack->u.string))
+	    {
+		FcConfigMessage (parse, FcSevereWarning, "invalid langset: %s", vstack->u.string);
+	    }
+	    else
+		n++;
+	    break;
+	default:
+		FcConfigMessage (parse, FcSevereError, "invalid element in langset");
+		break;
+	}
+	FcVStackPopAndDestroy (parse);
+    }
+    if (n > 0)
+	    FcVStackPushLangSet (parse, langset);
+    else
+	    FcLangSetDestroy (langset);
+}
+
 static FcBool
 FcConfigLexBinding (FcConfigParse   *parse,
 		    const FcChar8   *binding_string,
 		    FcValueBinding  *binding_ret)
 {
     FcValueBinding binding;
-    
+
     if (!binding_string)
 	binding = FcValueBindingWeak;
     else
@@ -1426,7 +1643,7 @@ FcParseAlias (FcConfigParse *parse)
     }
     if (prefer)
     {
-	edit = FcEditCreate (parse, 
+	edit = FcEditCreate (parse,
 			     FC_FAMILY_OBJECT,
 			     FcOpPrepend,
 			     prefer,
@@ -1515,9 +1732,17 @@ FcPopExpr (FcConfigParse *parse)
     case FcVStackMatrix:
 	expr = FcExprCreateMatrix (parse->config, vstack->u.matrix);
 	break;
+    case FcVStackRange:
+	break;
     case FcVStackBool:
 	expr = FcExprCreateBool (parse->config, vstack->u.bool_);
 	break;
+    case FcVStackCharSet:
+	expr = FcExprCreateCharSet (parse->config, vstack->u.charset);
+	break;
+    case FcVStackLangSet:
+	expr = FcExprCreateLangSet (parse->config, vstack->u.langset);
+	break;
     case FcVStackTest:
 	break;
     case FcVStackExpr:
@@ -1611,7 +1836,7 @@ FcParseInclude (FcConfigParse *parse)
     FcChar8	    *s;
     const FcChar8   *i;
     FcBool	    ignore_missing = FcFalse;
-    
+
     s = FcStrBufDoneStatic (&parse->pstack->str);
     if (!s)
     {
@@ -1637,7 +1862,7 @@ FcConfigLexOp (const FcChar8 *op, const FcOpMap	*map, int nmap)
     int	i;
 
     for (i = 0; i < nmap; i++)
-	if (!strcmp ((char *) op, map[i].name)) 
+	if (!strcmp ((char *) op, map[i].name))
 	    return map[i].op;
     return FcOpInvalid;
 }
@@ -1846,7 +2071,7 @@ FcParseMatch (FcConfigParse *parse)
 	    vstack->tag = FcVStackNone;
 	    if (kind == FcMatchScan && edit->object > FC_MAX_BASE_OBJECT)
 	    {
-		FcConfigMessage (parse, FcSevereError, 
+		FcConfigMessage (parse, FcSevereError,
 				 "<match target=\"scan\"> cannot edit user-defined object \"%s\"",
 				 FcObjectName(edit->object));
 	    }
@@ -1870,7 +2095,7 @@ FcParseAcceptRejectFont (FcConfigParse *parse, FcElement element)
     {
 	switch (vstack->tag) {
 	case FcVStackGlob:
-	    if (!FcConfigGlobAdd (parse->config, 
+	    if (!FcConfigGlobAdd (parse->config,
 				  vstack->u.string,
 				  element == FcElementAcceptfont))
 	    {
@@ -1901,12 +2126,12 @@ FcPopValue (FcConfigParse *parse)
 {
     FcVStack	*vstack = FcVStackPeek (parse);
     FcValue	value;
-    
+
     value.type = FcTypeVoid;
-    
+
     if (!vstack)
 	return value;
-    
+
     switch (vstack->tag) {
     case FcVStackString:
 	value.u.s = FcStrStaticName (vstack->u.string);
@@ -1934,13 +2159,23 @@ FcPopValue (FcConfigParse *parse)
 	value.u.b = vstack->u.bool_;
 	value.type = FcTypeBool;
 	break;
+    case FcVStackCharSet:
+	value.u.c = FcCharSetCopy (vstack->u.charset);
+	if (value.u.c)
+	    value.type = FcTypeCharSet;
+	break;
+    case FcVStackLangSet:
+	value.u.l = FcLangSetCopy (vstack->u.langset);
+	if (value.u.l)
+	    value.type = FcTypeLangSet;
+	break;
     default:
-	FcConfigMessage (parse, FcSevereWarning, "unknown pattern element %d", 
+	FcConfigMessage (parse, FcSevereWarning, "unknown pattern element %d",
 			 vstack->tag);
 	break;
     }
     FcVStackPopAndDestroy (parse);
-    
+
     return value;
 }
 
@@ -1964,7 +2199,7 @@ FcParsePatelt (FcConfigParse *parse)
 	FcPatternDestroy (pattern);
 	return;
     }
-    
+
     for (;;)
     {
 	value = FcPopValue (parse);
@@ -2199,11 +2434,17 @@ FcEndElement(void *userData, const XML_Char *name)
     case FcElementMatrix:
 	FcParseMatrix (parse);
 	break;
+    case FcElementRange:
+	FcParseRange (parse);
+	break;
     case FcElementBool:
 	FcParseBool (parse);
 	break;
-    case FcElementCharset:
-/*	FcParseCharset (parse); */
+    case FcElementCharSet:
+	FcParseCharSet (parse);
+	break;
+    case FcElementLangSet:
+	FcParseLangSet (parse);
 	break;
     case FcElementSelectfont:
 	break;
@@ -2296,7 +2537,7 @@ static void
 FcCharacterData (void *userData, const XML_Char *s, int len)
 {
     FcConfigParse   *parse = userData;
-    
+
     if (!parse->pstack)
 	return;
     if (!FcStrBufData (&parse->pstack->str, (FcChar8 *) s, len))
@@ -2382,18 +2623,18 @@ FcConfigParseAndLoadDir (FcConfig	*config,
 	ret = FcFalse;
 	goto bail1;
     }
-    
+
     strcpy ((char *) file, (char *) dir);
     strcat ((char *) file, "/");
     base = file + strlen ((char *) file);
-    
+
     files = FcStrSetCreate ();
     if (!files)
     {
 	ret = FcFalse;
 	goto bail2;
     }
-    
+
     if (FcDebug () & FC_DBG_CONFIG)
 	printf ("\tScanning config dir %s\n", dir);
 	
@@ -2421,7 +2662,7 @@ FcConfigParseAndLoadDir (FcConfig	*config,
     if (ret)
     {
 	int i;
-	qsort (files->strs, files->num, sizeof (FcChar8 *), 
+	qsort (files->strs, files->num, sizeof (FcChar8 *),
 	       (int (*)(const void *, const void *)) FcSortCmpStr);
 	for (i = 0; ret && i < files->num; i++)
 	    ret = FcConfigParseAndLoad (config, files->strs[i], complain);
@@ -2448,18 +2689,18 @@ FcConfigParseAndLoad (FcConfig	    *config,
     int		    len;
     FcConfigParse   parse;
     FcBool	    error = FcTrue;
-    
+
 #ifdef ENABLE_LIBXML2
     xmlSAXHandler   sax;
     char            buf[BUFSIZ];
 #else
     void	    *buf;
 #endif
-    
+
     filename = FcConfigFilename (name);
     if (!filename)
 	goto bail0;
-    
+
     if (FcStrSetMember (config->configFiles, filename))
     {
         FcStrFree (filename);
@@ -2483,11 +2724,11 @@ FcConfigParseAndLoad (FcConfig	    *config,
 	printf ("\tLoading config file %s\n", filename);
 
     fd = open ((char *) filename, O_RDONLY);
-    if (fd == -1) { 
+    if (fd == -1) {
 	FcStrFree (filename);
 	goto bail0;
     }
-    
+
 #ifdef ENABLE_LIBXML2
     memset(&sax, 0, sizeof(sax));
 
@@ -2512,7 +2753,7 @@ FcConfigParseAndLoad (FcConfig	    *config,
 #ifndef ENABLE_LIBXML2
 
     XML_SetUserData (p, &parse);
-    
+
     XML_SetDoctypeDeclHandler (p, FcStartDoctypeDecl, FcEndDoctypeDecl);
     XML_SetElementHandler (p, FcStartElement, FcEndElement);
     XML_SetCharacterDataHandler (p, FcCharacterData);
@@ -2541,7 +2782,7 @@ FcConfigParseAndLoad (FcConfig	    *config,
 	if (!XML_ParseBuffer (p, len, len == 0))
 #endif
 	{
-	    FcConfigMessage (&parse, FcSevereError, "%s", 
+	    FcConfigMessage (&parse, FcSevereError, "%s",
 			   XML_ErrorString (XML_GetErrorCode (p)));
 	    goto bail3;
 	}
-- 
cgit v1.2.3