[PATCH libXfont] Eliminate calls back to X server or font server functions by name (v2)

Keith Packard keithp at keithp.com
Wed Sep 2 14:30:48 PDT 2015


This eliminates the weak symbol adventures and makes all of the calls
back to the X server or Font server go through a table of functions
instead, clarifying the required API.

As this is a rather major change to the API for the library, it now
installs itself as libXfont2 instead of libXfont, and the package
config file is now xfont2.pc.

All of the installed headers remain the same as the original library;
there's now a new include file, libxfont2.h, which defines the X
server and Font server interfaces.

This moves util/atom.c to stubs/atom.c and reformats that file, hence
the diff being larger than it would otherwise be.

v2: Rename to libXfont2 instead of libXfont_2 as suggested by Emil Velikov
    Fix whitespace in stubs/atom.c, which was moved from util/

Signed-off-by: Keith Packard <keithp at keithp.com>
---
 Makefile.am                   |   7 +-
 configure.ac                  |   4 +-
 include/X11/fonts/bufio.h     |   2 +-
 include/X11/fonts/fontmisc.h  |   2 +-
 include/X11/fonts/libxfont2.h |  81 ++++++++++++++
 include/libxfontint.h         |  90 +++++++++++++++
 src/FreeType/ft.h             |   2 -
 src/FreeType/ftenc.c          |   1 +
 src/FreeType/ftfuncs.c        |   1 +
 src/FreeType/fttools.c        |   1 +
 src/FreeType/xttcap.c         |   1 +
 src/Makefile.am               |   8 +-
 src/bitmap/bdfread.c          |   1 +
 src/bitmap/bdfutils.c         |   1 +
 src/bitmap/bitmap.c           |   1 +
 src/bitmap/bitmapfunc.c       |   1 +
 src/bitmap/bitmaputil.c       |   1 +
 src/bitmap/bitscale.c         |   4 +-
 src/bitmap/fontink.c          |   1 +
 src/bitmap/pcfread.c          |   1 +
 src/bitmap/pcfwrite.c         |   7 +-
 src/bitmap/snfread.c          |   1 +
 src/builtins/dir.c            |   1 +
 src/builtins/file.c           |   1 +
 src/builtins/fonts.c          |   1 +
 src/builtins/fpe.c            |  36 +++---
 src/builtins/render.c         |   1 +
 src/fc/fsconvert.c            |   1 +
 src/fc/fserve.c               |  43 ++++----
 src/fc/fserve.h               |   9 --
 src/fc/fsio.c                 |   1 +
 src/fc/fstrans.c              |   2 +
 src/fontfile/bitsource.c      |   1 +
 src/fontfile/bufio.c          |   3 +-
 src/fontfile/bunzip2.c        |   1 +
 src/fontfile/catalogue.c      |  36 +++---
 src/fontfile/decompress.c     |   1 +
 src/fontfile/defaults.c       |   1 +
 src/fontfile/dirfile.c        |   1 +
 src/fontfile/fileio.c         |   1 +
 src/fontfile/filewr.c         |   1 +
 src/fontfile/fontdir.c        |   1 +
 src/fontfile/fontencc.c       |   3 +-
 src/fontfile/fontfile.c       |  36 +++---
 src/fontfile/fontscale.c      |   1 +
 src/fontfile/gunzip.c         |   1 +
 src/fontfile/register.c       |   1 +
 src/fontfile/renderers.c      |   3 +-
 src/stubs/Makefile.am         |  19 +---
 src/stubs/atom.c              | 224 +++++++++++++++++++++++++++++++++++++
 src/stubs/cauthgen.c          |  15 ---
 src/stubs/csignal.c           |  15 ---
 src/stubs/delfntcid.c         |  14 ---
 src/stubs/errorf.c            |  14 ---
 src/stubs/findoldfnt.c        |  15 ---
 src/stubs/getcres.c           |  15 ---
 src/stubs/getdefptsize.c      |  15 ---
 src/stubs/getnewfntcid.c      |  15 ---
 src/stubs/gettime.c           |  15 ---
 src/stubs/initfshdl.c         |  16 ---
 src/stubs/libxfontstubs.c     | 169 ++++++++++++++++++++++++++++
 src/stubs/regfpefunc.c        |  32 ------
 src/stubs/rmfshdl.c           |  16 ---
 src/stubs/servclient.c        |  19 ----
 src/stubs/setfntauth.c        |  15 ---
 src/stubs/stfntcfnt.c         |  15 ---
 src/stubs/stubs.h             |  88 ---------------
 src/stubs/stubsinit.c         |  82 --------------
 src/util/Makefile.am          |   1 -
 src/util/atom.c               | 250 ------------------------------------------
 src/util/fontaccel.c          |   1 +
 src/util/fontnames.c          |   1 +
 src/util/fontutil.c           |   1 +
 src/util/fontxlfd.c           |   1 +
 src/util/format.c             |   1 +
 src/util/miscutil.c           |  23 +---
 src/util/patcache.c           |   1 +
 src/util/private.c            |   1 +
 src/util/utilbitmap.c         |   1 +
 xfont.pc.in                   |  13 ---
 xfont2.pc.in                  |  13 +++
 81 files changed, 727 insertions(+), 816 deletions(-)
 create mode 100644 include/X11/fonts/libxfont2.h
 create mode 100644 include/libxfontint.h
 create mode 100644 src/stubs/atom.c
 delete mode 100644 src/stubs/cauthgen.c
 delete mode 100644 src/stubs/csignal.c
 delete mode 100644 src/stubs/delfntcid.c
 delete mode 100644 src/stubs/errorf.c
 delete mode 100644 src/stubs/findoldfnt.c
 delete mode 100644 src/stubs/getcres.c
 delete mode 100644 src/stubs/getdefptsize.c
 delete mode 100644 src/stubs/getnewfntcid.c
 delete mode 100644 src/stubs/gettime.c
 delete mode 100644 src/stubs/initfshdl.c
 create mode 100644 src/stubs/libxfontstubs.c
 delete mode 100644 src/stubs/regfpefunc.c
 delete mode 100644 src/stubs/rmfshdl.c
 delete mode 100644 src/stubs/servclient.c
 delete mode 100644 src/stubs/setfntauth.c
 delete mode 100644 src/stubs/stfntcfnt.c
 delete mode 100644 src/stubs/stubs.h
 delete mode 100644 src/stubs/stubsinit.c
 delete mode 100644 src/util/atom.c
 delete mode 100644 xfont.pc.in
 create mode 100644 xfont2.pc.in

diff --git a/Makefile.am b/Makefile.am
index 7ec3188..608d5de 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -35,13 +35,18 @@ libXfontinclude_HEADERS = \
 	include/X11/fonts/fontutil.h \
 	include/X11/fonts/fontxlfd.h \
 	include/X11/fonts/pcf.h      \
+	include/X11/fonts/libxfont2.h \
 	src/FreeType/ft.h	     \
 	src/FreeType/ftfuncs.h
+
+noinst_HEADERS = \
+	include/libxfontint.h
+
 nodist_libXfontinclude_HEADERS = \
 	include/X11/fonts/fontconf.h
 
 pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = xfont.pc
+pkgconfig_DATA = xfont2.pc
 
 MAINTAINERCLEANFILES = ChangeLog INSTALL
 
diff --git a/configure.ac b/configure.ac
index 7cb6bdf..443e927 100644
--- a/configure.ac
+++ b/configure.ac
@@ -21,7 +21,7 @@
 
 # Initialize Autoconf
 AC_PREREQ([2.60])
-AC_INIT([libXfont], [1.5.1],
+AC_INIT([libXfont], [2.0.0],
 	[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [libXfont])
 AC_CONFIG_SRCDIR([Makefile.am])
 AC_CONFIG_HEADERS([config.h include/X11/fonts/fontconf.h])
@@ -232,5 +232,5 @@ AC_CONFIG_FILES([Makefile
 		src/fc/Makefile
 		src/util/Makefile
 		src/stubs/Makefile
-		xfont.pc])
+		xfont2.pc])
 AC_OUTPUT
diff --git a/include/X11/fonts/bufio.h b/include/X11/fonts/bufio.h
index e7a9f4a..387533d 100644
--- a/include/X11/fonts/bufio.h
+++ b/include/X11/fonts/bufio.h
@@ -66,7 +66,7 @@ extern BufFilePtr BufFilePushBZIP2 ( BufFilePtr );
 #endif
 extern int BufFileClose ( BufFilePtr, int );
 extern int BufFileRead ( BufFilePtr, char*, int );
-extern int BufFileWrite ( BufFilePtr, char*, int );
+extern int BufFileWrite ( BufFilePtr, const char*, int );
 
 #define BufFileGet(f)	((f)->left-- ? *(f)->bufp++ : ((f)->eof = (*(f)->input) (f)))
 #define BufFilePut(c,f)	(--(f)->left ? *(f)->bufp++ = ((unsigned char)(c)) : (*(f)->output) ((unsigned char)(c),f))
diff --git a/include/X11/fonts/fontmisc.h b/include/X11/fonts/fontmisc.h
index d3926a7..06e49f5 100644
--- a/include/X11/fonts/fontmisc.h
+++ b/include/X11/fonts/fontmisc.h
@@ -54,7 +54,7 @@ in this Software without prior written authorization from The Open Group.
 
 extern Atom MakeAtom ( const char *string, unsigned len, int makeit );
 extern int ValidAtom ( Atom atom );
-extern char *NameForAtom (Atom atom);
+extern const char *NameForAtom (Atom atom);
 
 #define lowbit(x) ((x) & (~(x) + 1))
 
diff --git a/include/X11/fonts/libxfont2.h b/include/X11/fonts/libxfont2.h
new file mode 100644
index 0000000..74e2de0
--- /dev/null
+++ b/include/X11/fonts/libxfont2.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright © 2015 Keith Packard
+ *
+ * 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 copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS 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 _LIBXFONT2_H_
+#define _LIBXFONT2_H_
+
+#include	<stdarg.h>
+#include	<X11/Xfuncproto.h>
+
+#define FONT_FPE_FUNCS_VERSION	1
+
+typedef struct _font_fpe_funcs {
+	int		version;
+	NameCheckFunc	name_func;
+	InitFpeFunc	init_func;
+	FreeFpeFunc	free_func;
+	ResetFpeFunc	reset_func;
+	OpenFontFunc	open_func;
+	CloseFontFunc	close_func;
+	ListFontsFunc	list_func;
+	StartLfwiFunc	start_lfwi_func;
+	NextLfwiFunc	next_lfwi_func;
+	WakeupFpeFunc	wakeup_func;
+	ClientDiedFunc	client_died;
+	LoadGlyphsFunc	load_glyphs;
+	StartLaFunc	start_list_alias_func;
+	NextLaFunc	next_list_alias_func;
+	SetPathFunc	set_path_func;
+} font_fpe_funcs_rec, *font_fpe_funcs_ptr;
+
+#define FONT_CLIENT_FUNCS_VERSION	1
+
+typedef struct _font_client_funcs {
+	int			version;
+	int			(*client_auth_generation)(ClientPtr client);
+	Bool			(*client_signal)(ClientPtr client);
+	void			(*delete_font_client_id)(Font id);
+	void			(*verrorf)(const char *f, va_list ap) _X_ATTRIBUTE_PRINTF(1,0);
+	FontPtr			(*find_old_font)(FSID id);
+	FontResolutionPtr	(*get_client_resolutions)(int *num);
+	int			(*get_default_point_size)(void);
+	Font			(*get_new_font_client_id)(void);
+	uint32_t		(*get_time_in_millis)(void);
+	int			(*init_fs_handlers)(FontPathElementPtr fpe,
+						    BlockHandlerProcPtr block_handler);
+	int			(*register_fpe_funcs)(const font_fpe_funcs_rec *funcs);
+	void			(*remove_fs_handlers)(FontPathElementPtr fpe,
+						      BlockHandlerProcPtr block_handler,
+						      Bool all );
+	void			*(*get_server_client)(void);
+	int			(*set_font_authorizations)(char **authorizations,
+							   int *authlen, void *client);
+	int			(*store_font_client_font)(FontPtr pfont, Font id);
+	Atom			(*make_atom)(const char *string, unsigned len, int makeit);
+	int			(*valid_atom)(Atom atom);
+	const char		*(*name_for_atom)(Atom atom);
+	unsigned long		(*get_server_generation)(void);
+} font_client_funcs_rec, *font_client_funcs_ptr;
+
+extern void	font_register_client_funcs(font_client_funcs_rec const *client_funcs);
+
+#endif /* _LIBXFONT2_H_ */
diff --git a/include/libxfontint.h b/include/libxfontint.h
new file mode 100644
index 0000000..8b45d6a
--- /dev/null
+++ b/include/libxfontint.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright © 2015 Keith Packard
+ *
+ * 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 copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS 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 _LIBXFONTINT_H_
+#define _LIBXFONTINT_H_
+
+#define client_auth_generation __libxfont__client_auth_generation
+#define ClientSignal __libxfont__ClientSignal
+#define DeleteFontClientID __libxfont__DeleteFontClientID
+#define ErrorF __libxfont__ErrorF
+#define find_old_font __libxfont__find_old_font
+#define GetClientResolutions __libxfont__GetClientResolutions
+#define GetDefaultPointSize __libxfont__GetDefaultPointSize
+#define GetNewFontClientID __libxfont__GetNewFontClientID
+#define GetTimeInMillis  __libxfont__GetTimeInMillis
+#define init_fs_handlers __libxfont__init_fs_handlers
+#define remove_fs_handlers __libxfont__remove_fs_handlers
+#define __GetServerClient __libxfont____GetServerClient
+#define set_font_authorizations __libxfont__set_font_authorizations
+#define StoreFontClientFont __libxfont__StoreFontClientFont
+#define MakeAtom __libxfont__MakeAtom
+#define ValidAtom __libxfont__ValidAtom
+#define NameForAtom __libxfont__NameForAtom
+
+#include	<X11/fonts/FS.h>
+#include	<X11/fonts/FSproto.h>
+#include	<X11/X.h>
+#include	<X11/Xos.h>
+#include	<X11/fonts/fontmisc.h>
+#include	<X11/fonts/fontstruct.h>
+#include	<X11/fonts/fontutil.h>
+#include	<X11/fonts/fontproto.h>
+#include	<errno.h>
+#include	<limits.h>
+#include	<stdint.h>
+
+#include <X11/fonts/libxfont2.h>
+
+#ifndef LIBXFONT_SKIP_ERRORF
+void
+ErrorF(const char *f, ...)  _X_ATTRIBUTE_PRINTF(1,2);
+#endif
+
+FontPtr
+find_old_font(FSID id);
+
+unsigned long
+GetTimeInMillis (void);
+
+int
+register_fpe_funcs(const font_fpe_funcs_rec *funcs);
+
+void *
+__GetServerClient(void);
+
+int
+set_font_authorizations(char **authorizations, int *authlen, ClientPtr client);
+
+unsigned long
+__GetServerGeneration (void);
+
+Atom
+__libxfont_internal__MakeAtom(const char *string, unsigned len, int makeit);
+
+int
+__libxfont_internal__ValidAtom(Atom atom);
+
+const char *
+__libxfont_internal__NameForAtom(Atom atom);
+
+#endif /* _LIBXFONTINT_H_ */
diff --git a/src/FreeType/ft.h b/src/FreeType/ft.h
index 8cf31d4..7fa86b0 100644
--- a/src/FreeType/ft.h
+++ b/src/FreeType/ft.h
@@ -82,6 +82,4 @@ unsigned FTRemap(FT_Face face, FTMappingPtr, unsigned code);
 int FTtoXReturnCode(int);
 int FTGetEnglishName(FT_Face, int, char *, int);
 
-extern void ErrorF(const char*, ...);
-
 #endif /* _FT_H_ */
diff --git a/src/FreeType/ftenc.c b/src/FreeType/ftenc.c
index 9e31d75..dfa5cab 100644
--- a/src/FreeType/ftenc.c
+++ b/src/FreeType/ftenc.c
@@ -23,6 +23,7 @@ THE SOFTWARE.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include <string.h>
 
 #include <X11/fonts/fntfilst.h>
diff --git a/src/FreeType/ftfuncs.c b/src/FreeType/ftfuncs.c
index a4969d1..77344cd 100644
--- a/src/FreeType/ftfuncs.c
+++ b/src/FreeType/ftfuncs.c
@@ -29,6 +29,7 @@ THE SOFTWARE.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include <X11/fonts/fontmisc.h>
 
 #include <string.h>
diff --git a/src/FreeType/fttools.c b/src/FreeType/fttools.c
index 8c5d08e..7c0bd9b 100644
--- a/src/FreeType/fttools.c
+++ b/src/FreeType/fttools.c
@@ -24,6 +24,7 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include <X11/fonts/fontmisc.h>
 #include <ctype.h>
 #include <string.h>
diff --git a/src/FreeType/xttcap.c b/src/FreeType/xttcap.c
index cee752e..c6be080 100644
--- a/src/FreeType/xttcap.c
+++ b/src/FreeType/xttcap.c
@@ -41,6 +41,7 @@ static char const * const releaseID =
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include <X11/fonts/fontmisc.h>
 #include <string.h>
 #include <ctype.h>
diff --git a/src/Makefile.am b/src/Makefile.am
index 33fd135..03c704a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -19,7 +19,7 @@
 #  TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 #  PERFORMANCE OF THIS SOFTWARE.
 
-lib_LTLIBRARIES = libXfont.la
+lib_LTLIBRARIES = libXfont2.la
 
 AM_CFLAGS = $(OS_CFLAGS) $(CWARNFLAGS)
 
@@ -58,11 +58,11 @@ SUBDIRS=\
 	$(FONTFILE_DIR) $(FREETYPE_DIR) $(BITMAP_DIR) \
 	$(BUILTINS_DIR) $(FC_DIR) $(UTIL_DIR) $(STUBS_DIR)
 
-libXfont_la_LIBADD = \
+libXfont2_la_LIBADD = \
 	$(FONTFILE_LIB) $(FREETYPE_LIB) $(BITMAP_LIB) \
 	$(BUILTINS_LIB) $(FC_LIB) $(UTIL_LIB) $(STUBS_LIB) \
 	$(FREETYPE_LIBS) $(Z_LIBS) $(MATH_LIBS) $(XFONT_LIBS)
 
-libXfont_la_SOURCES = dummy.c
+libXfont2_la_SOURCES = dummy.c
 
-libXfont_la_LDFLAGS = -version-number 1:4:1 -no-undefined
+libXfont2_la_LDFLAGS = -version-number 2:0:0 -no-undefined
diff --git a/src/bitmap/bdfread.c b/src/bitmap/bdfread.c
index eccd7b7..1689a3b 100644
--- a/src/bitmap/bdfread.c
+++ b/src/bitmap/bdfread.c
@@ -52,6 +52,7 @@ from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 
 #include <ctype.h>
 #include <X11/fonts/fntfilst.h>
diff --git a/src/bitmap/bdfutils.c b/src/bitmap/bdfutils.c
index 288148b..91069ed 100644
--- a/src/bitmap/bdfutils.c
+++ b/src/bitmap/bdfutils.c
@@ -52,6 +52,7 @@ from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 
 #include <ctype.h>
 #include <stdio.h>
diff --git a/src/bitmap/bitmap.c b/src/bitmap/bitmap.c
index 0a379eb..a780506 100644
--- a/src/bitmap/bitmap.c
+++ b/src/bitmap/bitmap.c
@@ -31,6 +31,7 @@ in this Software without prior written authorization from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 
 #include <X11/fonts/fntfilst.h>
 #include <X11/fonts/bitmap.h>
diff --git a/src/bitmap/bitmapfunc.c b/src/bitmap/bitmapfunc.c
index 8c6b3d8..3087e47 100644
--- a/src/bitmap/bitmapfunc.c
+++ b/src/bitmap/bitmapfunc.c
@@ -31,6 +31,7 @@ in this Software without prior written authorization from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 
 #include <X11/fonts/fntfilst.h>
 #include <X11/fonts/bitmap.h>
diff --git a/src/bitmap/bitmaputil.c b/src/bitmap/bitmaputil.c
index 0a1c87e..232729f 100644
--- a/src/bitmap/bitmaputil.c
+++ b/src/bitmap/bitmaputil.c
@@ -29,6 +29,7 @@ from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 
 #include <X11/fonts/fntfilst.h>
 #include <X11/fonts/bitmap.h>
diff --git a/src/bitmap/bitscale.c b/src/bitmap/bitscale.c
index c9af4c0..22747a9 100644
--- a/src/bitmap/bitscale.c
+++ b/src/bitmap/bitscale.c
@@ -33,6 +33,7 @@ from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 
 #include <X11/fonts/fntfilst.h>
 #include <X11/fonts/bitmap.h>
@@ -43,9 +44,6 @@ from The Open Group.
 #define   MAX(a,b)    (((a)>(b)) ? a : b)
 #endif
 
-/* Should get this from elsewhere */
-extern unsigned long __GetServerGeneration(void);
-
 static void bitmapUnloadScalable (FontPtr pFont);
 static void ScaleBitmap ( FontPtr pFont, CharInfoPtr opci,
 			  CharInfoPtr pci, double *inv_xform,
diff --git a/src/bitmap/fontink.c b/src/bitmap/fontink.c
index f4898da..ea915e4 100644
--- a/src/bitmap/fontink.c
+++ b/src/bitmap/fontink.c
@@ -33,6 +33,7 @@ from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 
 #include <X11/fonts/fntfilst.h>
 #include <X11/fonts/bitmap.h>
diff --git a/src/bitmap/pcfread.c b/src/bitmap/pcfread.c
index 34eeeb7..69af059 100644
--- a/src/bitmap/pcfread.c
+++ b/src/bitmap/pcfread.c
@@ -33,6 +33,7 @@ from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 
 #include <X11/fonts/fntfilst.h>
 #include <X11/fonts/bitmap.h>
diff --git a/src/bitmap/pcfwrite.c b/src/bitmap/pcfwrite.c
index 0874c4b..61ae83d 100644
--- a/src/bitmap/pcfwrite.c
+++ b/src/bitmap/pcfwrite.c
@@ -33,6 +33,7 @@ from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 
 #include <X11/fonts/fntfilst.h>
 #include <X11/fonts/bitmap.h>
@@ -43,7 +44,7 @@ from The Open Group.
 static CARD32  current_position;
 
 static int
-pcfWrite(FontFilePtr file, char *b, int c)
+pcfWrite(FontFilePtr file, const char *b, int c)
 {
     current_position += c;
     return FontFileWrite(file, b, c);
@@ -189,7 +190,7 @@ pcfPutAccel(FontFilePtr file, CARD32 format, FontInfoPtr pFontInfo)
 
 #define CanCompressMetrics(min,max) (CanCompressMetric(min) && CanCompressMetric(max))
 
-static char *
+static const char *
 pcfNameForAtom(Atom a)
 {
     return NameForAtom(a);
@@ -218,7 +219,7 @@ pcfWriteFont(FontPtr pFont, FontFilePtr file)
     int         header_size;
     FontPropPtr offsetProps;
     int         prop_pad = 0;
-    char       *atom_name;
+    const char  *atom_name;
     int         glyph;
     CARD32      offset;
 
diff --git a/src/bitmap/snfread.c b/src/bitmap/snfread.c
index da362c8..452b99d 100644
--- a/src/bitmap/snfread.c
+++ b/src/bitmap/snfread.c
@@ -52,6 +52,7 @@ from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 
 #include <ctype.h>
 #include <X11/fonts/fntfilst.h>
diff --git a/src/builtins/dir.c b/src/builtins/dir.c
index 0225bfc..bda5647 100644
--- a/src/builtins/dir.c
+++ b/src/builtins/dir.c
@@ -24,6 +24,7 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include "builtin.h"
 
 static BuiltinDirPtr
diff --git a/src/builtins/file.c b/src/builtins/file.c
index 93527c1..3cfcf0c 100644
--- a/src/builtins/file.c
+++ b/src/builtins/file.c
@@ -24,6 +24,7 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include <string.h>
 #include "builtin.h"
 
diff --git a/src/builtins/fonts.c b/src/builtins/fonts.c
index 3892178..bb593d7 100644
--- a/src/builtins/fonts.c
+++ b/src/builtins/fonts.c
@@ -24,6 +24,7 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include "builtin.h"
 
 static const char file_cursor[] = {
diff --git a/src/builtins/fpe.c b/src/builtins/fpe.c
index 4f5d4cf..207ff51 100644
--- a/src/builtins/fpe.c
+++ b/src/builtins/fpe.c
@@ -24,6 +24,7 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include    <X11/fonts/fntfilst.h>
 #include "builtin.h"
 
@@ -65,24 +66,29 @@ BuiltinFreeFPE (FontPathElementPtr fpe)
     return Successful;
 }
 
+static const font_fpe_funcs_rec builtin_fpe_funcs = {
+	.version = FONT_FPE_FUNCS_VERSION,
+	.name_func = BuiltinNameCheck,
+	.init_func = BuiltinInitFPE,
+	.free_func = BuiltinFreeFPE,
+	.reset_func = BuiltinResetFPE,
+	.open_func = FontFileOpenFont,
+	.close_func = FontFileCloseFont,
+	.list_func = FontFileListFonts,
+	.start_lfwi_func = FontFileStartListFontsWithInfo,
+	.next_lfwi_func = FontFileListNextFontWithInfo,
+	.wakeup_func = (WakeupFpeFunc) 0,
+	.client_died = (ClientDiedFunc) 0,
+	.load_glyphs = (LoadGlyphsFunc) 0,
+	.start_list_alias_func = (StartLaFunc) 0,
+	.next_list_alias_func = (NextLaFunc) 0,
+	.set_path_func = (SetPathFunc) 0
+};
+
 void
 BuiltinRegisterFpeFunctions(void)
 {
     BuiltinRegisterFontFileFunctions ();
 
-    font_file_type = RegisterFPEFunctions(BuiltinNameCheck,
-					  BuiltinInitFPE,
-					  BuiltinFreeFPE,
-					  BuiltinResetFPE,
-					  FontFileOpenFont,
-					  FontFileCloseFont,
-					  FontFileListFonts,
-					  FontFileStartListFontsWithInfo,
-					  FontFileListNextFontWithInfo,
-					  (WakeupFpeFunc) 0,
-					  (ClientDiedFunc) 0,
-					  (LoadGlyphsFunc) 0,
-					  (StartLaFunc) 0,
-					  (NextLaFunc) 0,
-					  (SetPathFunc) 0);
+    font_file_type = register_fpe_funcs(&builtin_fpe_funcs);
 }
diff --git a/src/builtins/render.c b/src/builtins/render.c
index 2be0053..7676c87 100644
--- a/src/builtins/render.c
+++ b/src/builtins/render.c
@@ -24,6 +24,7 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include    <X11/fonts/fntfilst.h>
 #include    <X11/fonts/fontutil.h>
 #include    <X11/fonts/pcf.h>
diff --git a/src/fc/fsconvert.c b/src/fc/fsconvert.c
index 18b0c0d..312bacb 100644
--- a/src/fc/fsconvert.c
+++ b/src/fc/fsconvert.c
@@ -28,6 +28,7 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include        <X11/X.h>
 #include 	<X11/Xtrans/Xtrans.h>
 #include	<X11/Xpoll.h>
diff --git a/src/fc/fserve.c b/src/fc/fserve.c
index 92b0d53..f0d22b9 100644
--- a/src/fc/fserve.c
+++ b/src/fc/fserve.c
@@ -53,6 +53,7 @@ in this Software without prior written authorization from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 
 #ifdef WIN32
 #define _WILLWINSOCK_
@@ -101,8 +102,6 @@ in this Software without prior written authorization from The Open Group.
 /* Somewhat arbitrary limit on maximum reply size we'll try to read. */
 #define MAX_REPLY_LENGTH	((64 * 1024 * 1024) >> 2)
 
-extern void ErrorF(const char *f, ...);
-
 static int fs_read_glyphs ( FontPathElementPtr fpe, FSBlockDataPtr blockrec );
 static int fs_read_list ( FontPathElementPtr fpe, FSBlockDataPtr blockrec );
 static int fs_read_list_info ( FontPathElementPtr fpe,
@@ -2160,11 +2159,6 @@ fs_send_load_glyphs(pointer client, FontPtr pfont,
     return Suspended;
 }
 
-
-extern pointer __GetServerClient(void);	/* This could be any number that
-				   doesn't conflict with existing
-				   client values. */
-
 static int
 _fs_load_glyphs(pointer client, FontPtr pfont, Bool range_flag,
 		unsigned int nchars, int item_size, unsigned char *data)
@@ -3395,22 +3389,27 @@ _fs_free_conn (FSFpePtr conn)
  * called at server init time
  */
 
+static const font_fpe_funcs_rec fs_fpe_funcs = {
+	.version = FONT_FPE_FUNCS_VERSION,
+	.name_func = fs_name_check,
+	.init_func = fs_init_fpe,
+	.free_func = fs_free_fpe,
+	.reset_func = fs_reset_fpe,
+	.open_func = fs_open_font,
+	.close_func = fs_close_font,
+	.list_func = fs_list_fonts,
+	.start_lfwi_func = fs_start_list_with_info,
+	.next_lfwi_func = fs_next_list_with_info,
+	.wakeup_func = fs_wakeup,
+	.client_died = fs_client_died,
+	.load_glyphs = _fs_load_glyphs,
+	.start_list_alias_func = (StartLaFunc) 0,
+	.next_list_alias_func = (NextLaFunc) 0,
+	.set_path_func = (SetPathFunc) 0
+};
+
 void
 fs_register_fpe_functions(void)
 {
-    RegisterFPEFunctions(fs_name_check,
-			 fs_init_fpe,
-			 fs_free_fpe,
-			 fs_reset_fpe,
-			 fs_open_font,
-			 fs_close_font,
-			 fs_list_fonts,
-			 fs_start_list_with_info,
-			 fs_next_list_with_info,
-			 fs_wakeup,
-			 fs_client_died,
-			 _fs_load_glyphs,
-			 NULL,
-			 NULL,
-			 NULL);
+    register_fpe_funcs(&fs_fpe_funcs);
 }
diff --git a/src/fc/fserve.h b/src/fc/fserve.h
index 502e201..27c12a7 100644
--- a/src/fc/fserve.h
+++ b/src/fc/fserve.h
@@ -79,13 +79,4 @@ extern FontPtr fs_create_font (FontPathElementPtr   fpe,
 
 extern int fs_load_all_glyphs ( FontPtr pfont );
 
-/*
- * These should be declared elsewhere, but I'm concerned that moving them
- * would cause problems building other pieces
- */
-extern FontPtr find_old_font (Font id);
-extern int  set_font_authorizations (char **a, int *len, pointer client);
-extern long   GetTimeInMillis (void);
-
-
 #endif				/* _FSERVE_H_ */
diff --git a/src/fc/fsio.c b/src/fc/fsio.c
index 4deab88..3be81ed 100644
--- a/src/fc/fsio.c
+++ b/src/fc/fsio.c
@@ -29,6 +29,7 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 
 #ifdef WIN32
 #define _WILLWINSOCK_
diff --git a/src/fc/fstrans.c b/src/fc/fstrans.c
index 24fceee..902ef36 100644
--- a/src/fc/fstrans.c
+++ b/src/fc/fstrans.c
@@ -23,6 +23,8 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#define LIBXFONT_SKIP_ERRORF
+#include "libxfontint.h"
 #define FONT_t
 #define TRANS_CLIENT
 #include <X11/Xtrans/transport.c>
diff --git a/src/fontfile/bitsource.c b/src/fontfile/bitsource.c
index c73f41f..3a6a20f 100644
--- a/src/fontfile/bitsource.c
+++ b/src/fontfile/bitsource.c
@@ -31,6 +31,7 @@ in this Software without prior written authorization from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include <X11/fonts/fntfilst.h>
 
 BitmapSourcesRec	FontFileBitmapSources;
diff --git a/src/fontfile/bufio.c b/src/fontfile/bufio.c
index d8d4f29..de06e1a 100644
--- a/src/fontfile/bufio.c
+++ b/src/fontfile/bufio.c
@@ -34,6 +34,7 @@ from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include <X11/Xos.h>
 #include <X11/fonts/fontmisc.h>
 #include <X11/fonts/bufio.h>
@@ -184,7 +185,7 @@ BufFileRead (BufFilePtr f, char *b, int n)
 }
 
 int
-BufFileWrite (BufFilePtr f, char *b, int n)
+BufFileWrite (BufFilePtr f, const char *b, int n)
 {
     int	    cnt;
     cnt = n;
diff --git a/src/fontfile/bunzip2.c b/src/fontfile/bunzip2.c
index 4078796..34065f8 100644
--- a/src/fontfile/bunzip2.c
+++ b/src/fontfile/bunzip2.c
@@ -29,6 +29,7 @@
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
+#include "libxfontint.h"
 
 #include <X11/fonts/fontmisc.h>
 #include <X11/fonts/bufio.h>
diff --git a/src/fontfile/catalogue.c b/src/fontfile/catalogue.c
index 81a1e13..41fb0b4 100644
--- a/src/fontfile/catalogue.c
+++ b/src/fontfile/catalogue.c
@@ -27,6 +27,7 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 
 #ifdef HAVE_READLINK
 #include <X11/fonts/fntfilst.h>
@@ -450,24 +451,29 @@ CatalogueListNextFontOrAlias(pointer client, FontPathElementPtr fpe,
     return ret;
 }
 
+static const font_fpe_funcs_rec catalogue_fpe_funcs = {
+	.version = FONT_FPE_FUNCS_VERSION,
+	.name_func = CatalogueNameCheck,
+	.init_func = CatalogueInitFPE,
+	.free_func = CatalogueFreeFPE,
+	.reset_func = CatalogueResetFPE,
+	.open_func = CatalogueOpenFont,
+	.close_func = CatalogueCloseFont,
+	.list_func = CatalogueListFonts,
+	.start_lfwi_func = CatalogueStartListFontsWithInfo,
+	.next_lfwi_func = CatalogueListNextFontWithInfo,
+	.wakeup_func = (WakeupFpeFunc) 0,
+	.client_died = (ClientDiedFunc) 0,
+	.load_glyphs = (LoadGlyphsFunc) 0,
+	.start_list_alias_func = CatalogueStartListFontsAndAliases,
+	.next_list_alias_func = CatalogueListNextFontOrAlias,
+	.set_path_func = FontFileEmptyBitmapSource,
+};
+
 void
 CatalogueRegisterLocalFpeFunctions (void)
 {
-    RegisterFPEFunctions(CatalogueNameCheck,
-			 CatalogueInitFPE,
-			 CatalogueFreeFPE,
-			 CatalogueResetFPE,
-			 CatalogueOpenFont,
-			 CatalogueCloseFont,
-			 CatalogueListFonts,
-			 CatalogueStartListFontsWithInfo,
-			 CatalogueListNextFontWithInfo,
-			 NULL,
-			 NULL,
-			 NULL,
-			 CatalogueStartListFontsAndAliases,
-			 CatalogueListNextFontOrAlias,
-			 FontFileEmptyBitmapSource);
+    register_fpe_funcs(&catalogue_fpe_funcs);
 }
 
 #endif /* HAVE_READLINK */
diff --git a/src/fontfile/decompress.c b/src/fontfile/decompress.c
index 20971df..42e7aa0 100644
--- a/src/fontfile/decompress.c
+++ b/src/fontfile/decompress.c
@@ -51,6 +51,7 @@ in this Software without prior written authorization from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include <X11/fonts/fontmisc.h>
 #include <X11/fonts/bufio.h>
 
diff --git a/src/fontfile/defaults.c b/src/fontfile/defaults.c
index 1ad7d7c..62b4dd5 100644
--- a/src/fontfile/defaults.c
+++ b/src/fontfile/defaults.c
@@ -31,6 +31,7 @@ in this Software without prior written authorization from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include    <X11/X.h>
 #include    <X11/Xproto.h>
 
diff --git a/src/fontfile/dirfile.c b/src/fontfile/dirfile.c
index 38ced75..04cfa40 100644
--- a/src/fontfile/dirfile.c
+++ b/src/fontfile/dirfile.c
@@ -37,6 +37,7 @@ in this Software without prior written authorization from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include <X11/fonts/fntfilst.h>
 #include <stdio.h>
 #include <sys/types.h>
diff --git a/src/fontfile/fileio.c b/src/fontfile/fileio.c
index d44cecd..074ebcb 100644
--- a/src/fontfile/fileio.c
+++ b/src/fontfile/fileio.c
@@ -31,6 +31,7 @@ in this Software without prior written authorization from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include <X11/fonts/fntfilio.h>
 #include <X11/Xos.h>
 #ifndef O_BINARY
diff --git a/src/fontfile/filewr.c b/src/fontfile/filewr.c
index 859a0be..2431784 100644
--- a/src/fontfile/filewr.c
+++ b/src/fontfile/filewr.c
@@ -31,6 +31,7 @@ in this Software without prior written authorization from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include <X11/fonts/fntfilio.h>
 #include <X11/Xos.h>
 #ifndef O_BINARY
diff --git a/src/fontfile/fontdir.c b/src/fontfile/fontdir.c
index 7271603..f4f704d 100644
--- a/src/fontfile/fontdir.c
+++ b/src/fontfile/fontdir.c
@@ -31,6 +31,7 @@ in this Software without prior written authorization from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include    <X11/fonts/fntfilst.h>
 #include    <X11/keysym.h>
 
diff --git a/src/fontfile/fontencc.c b/src/fontfile/fontencc.c
index 4bdb495..b5c684b 100644
--- a/src/fontfile/fontencc.c
+++ b/src/fontfile/fontencc.c
@@ -30,11 +30,10 @@ THE SOFTWARE.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include <X11/fonts/fontenc.h>
 #include <X11/fonts/fontencc.h>
 
-extern void ErrorF(const char *f, ...);
-
 char *
 font_encoding_from_xlfd(const char * name, int length)
 {
diff --git a/src/fontfile/fontfile.c b/src/fontfile/fontfile.c
index 05a9610..97adbcf 100644
--- a/src/fontfile/fontfile.c
+++ b/src/fontfile/fontfile.c
@@ -31,6 +31,7 @@ in this Software without prior written authorization from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include <X11/fonts/fntfilst.h>
 #include <X11/keysym.h>
 #ifdef WIN32
@@ -1115,22 +1116,27 @@ FontFileListNextFontOrAlias(pointer client, FontPathElementPtr fpe,
     return ret;
 }
 
+static const font_fpe_funcs_rec fontfile_fpe_funcs = {
+	.version = FONT_FPE_FUNCS_VERSION,
+	.name_func = FontFileNameCheck,
+	.init_func = FontFileInitFPE,
+	.free_func = FontFileFreeFPE,
+	.reset_func = FontFileResetFPE,
+	.open_func = FontFileOpenFont,
+	.close_func = FontFileCloseFont,
+	.list_func = FontFileListFonts,
+	.start_lfwi_func = FontFileStartListFontsWithInfo,
+	.next_lfwi_func = FontFileListNextFontWithInfo,
+	.wakeup_func = (WakeupFpeFunc) 0,
+	.client_died = (ClientDiedFunc) 0,
+	.load_glyphs = (LoadGlyphsFunc) 0,
+	.start_list_alias_func = FontFileStartListFontsAndAliases,
+	.next_list_alias_func = FontFileListNextFontOrAlias,
+	.set_path_func = FontFileEmptyBitmapSource,
+};
+
 void
 FontFileRegisterLocalFpeFunctions (void)
 {
-    RegisterFPEFunctions(FontFileNameCheck,
-			 FontFileInitFPE,
-			 FontFileFreeFPE,
-			 FontFileResetFPE,
-			 FontFileOpenFont,
-			 FontFileCloseFont,
-			 FontFileListFonts,
-			 FontFileStartListFontsWithInfo,
-			 FontFileListNextFontWithInfo,
-			 NULL,
-			 NULL,
-			 NULL,
-			 FontFileStartListFontsAndAliases,
-			 FontFileListNextFontOrAlias,
-			 FontFileEmptyBitmapSource);
+    register_fpe_funcs(&fontfile_fpe_funcs);
 }
diff --git a/src/fontfile/fontscale.c b/src/fontfile/fontscale.c
index a21802f..bbc8e10 100644
--- a/src/fontfile/fontscale.c
+++ b/src/fontfile/fontscale.c
@@ -31,6 +31,7 @@ in this Software without prior written authorization from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include    <X11/fonts/fntfilst.h>
 #include <math.h>
 
diff --git a/src/fontfile/gunzip.c b/src/fontfile/gunzip.c
index 84a4eaf..36f020a 100644
--- a/src/fontfile/gunzip.c
+++ b/src/fontfile/gunzip.c
@@ -5,6 +5,7 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include <X11/fonts/fontmisc.h>
 #include <X11/fonts/bufio.h>
 #include <zlib.h>
diff --git a/src/fontfile/register.c b/src/fontfile/register.c
index 4faeb8f..c3c8972 100644
--- a/src/fontfile/register.c
+++ b/src/fontfile/register.c
@@ -29,6 +29,7 @@ in this Software without prior written authorization from The Open Group.
 #else
 #define XFONT_BITMAP 1
 #endif
+#include "libxfontint.h"
 
 #include <X11/fonts/fontmisc.h>
 #include <X11/fonts/fntfilst.h>
diff --git a/src/fontfile/renderers.c b/src/fontfile/renderers.c
index bbcd466..d0c4064 100644
--- a/src/fontfile/renderers.c
+++ b/src/fontfile/renderers.c
@@ -31,8 +31,8 @@ in this Software without prior written authorization from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include <X11/fonts/fntfilst.h>
-extern void ErrorF(const char *f, ...);
 
 static FontRenderersRec	renderers;
 
@@ -40,7 +40,6 @@ static FontRenderersRec	renderers;
  * XXX Maybe should allow unregistering renders. For now, just clear the
  * list at each new generation.
  */
-extern unsigned long __GetServerGeneration(void);
 static unsigned long rendererGeneration = 0;
 
 Bool
diff --git a/src/stubs/Makefile.am b/src/stubs/Makefile.am
index 7eb16d4..65950cc 100644
--- a/src/stubs/Makefile.am
+++ b/src/stubs/Makefile.am
@@ -6,20 +6,5 @@ AM_CFLAGS = $(XFONT_CFLAGS) $(OS_CFLAGS) $(CWARNFLAGS)
 noinst_LTLIBRARIES = libstubs.la
 
 libstubs_la_SOURCES = 		\
-	cauthgen.c		\
-	csignal.c		\
-	delfntcid.c		\
-	errorf.c		\
-	findoldfnt.c		\
-	getcres.c		\
-	getdefptsize.c		\
-	getnewfntcid.c		\
-	gettime.c		\
-	initfshdl.c		\
-	regfpefunc.c		\
-	rmfshdl.c		\
-	servclient.c		\
-	setfntauth.c		\
-	stfntcfnt.c		\
-	stubsinit.c		\
-	stubs.h
+	atom.c			\
+	libxfontstubs.c
diff --git a/src/stubs/atom.c b/src/stubs/atom.c
new file mode 100644
index 0000000..82c8ca3
--- /dev/null
+++ b/src/stubs/atom.c
@@ -0,0 +1,224 @@
+/*
+
+  Copyright 1990, 1994, 1998  The Open Group
+
+  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.
+
+  The above copyright notice and this permission notice shall be included in
+  all copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+  OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+  AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+  Except as contained in this notice, the name of The Open Group shall not be
+  used in advertising or otherwise to promote the sale, use or other dealings
+  in this Software without prior written authorization from The Open Group.
+
+*/
+
+/*
+ * Author:  Keith Packard, MIT X Consortium
+ */
+
+/* lame atom replacement routines for font applications */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "libxfontint.h"
+#include <X11/fonts/fontmisc.h>
+
+typedef struct _AtomList {
+    char *name;
+    int len;
+    int hash;
+    Atom atom;
+} AtomListRec, *AtomListPtr;
+
+static AtomListPtr *hashTable;
+
+static int hashSize, hashUsed;
+static int hashMask;
+static int rehash;
+
+static AtomListPtr *reverseMap;
+static int reverseMapSize;
+static Atom lastAtom;
+
+static int
+Hash(const char *string, int len)
+{
+    int h;
+
+    h = 0;
+    while (len--)
+        h = (h << 3) ^ *string++;
+    if (h < 0)
+        return -h;
+    return h;
+}
+
+static int
+ResizeHashTable(void)
+{
+    int newHashSize;
+    int newHashMask;
+    AtomListPtr *newHashTable;
+    int i;
+    int h;
+    int newRehash;
+    int r;
+
+    if (hashSize == 0)
+        newHashSize = 1024;
+    else
+        newHashSize = hashSize * 2;
+    newHashTable = calloc(newHashSize, sizeof(AtomListPtr));
+    if (!newHashTable) {
+        fprintf(stderr, "ResizeHashTable(): Error: Couldn't allocate"
+                " newHashTable (%ld)\n",
+                newHashSize * (unsigned long) sizeof(AtomListPtr));
+        return FALSE;
+    }
+    newHashMask = newHashSize - 1;
+    newRehash = (newHashMask - 2);
+    for (i = 0; i < hashSize; i++) {
+        if (hashTable[i]) {
+            h = (hashTable[i]->hash) & newHashMask;
+            if (newHashTable[h]) {
+                r = hashTable[i]->hash % newRehash | 1;
+                do {
+                    h += r;
+                    if (h >= newHashSize)
+                        h -= newHashSize;
+                } while (newHashTable[h]);
+            }
+            newHashTable[h] = hashTable[i];
+        }
+    }
+    free(hashTable);
+    hashTable = newHashTable;
+    hashSize = newHashSize;
+    hashMask = newHashMask;
+    rehash = newRehash;
+    return TRUE;
+}
+
+static int
+ResizeReverseMap(void)
+{
+    AtomListPtr *newMap;
+    int newMapSize;
+
+    if (reverseMapSize == 0)
+        newMapSize = 1000;
+    else
+        newMapSize = reverseMapSize * 2;
+    newMap = realloc(reverseMap, newMapSize * sizeof(AtomListPtr));
+    if (newMap == NULL) {
+        fprintf(stderr, "ResizeReverseMap(): Error: Couldn't reallocate"
+                " reverseMap (%ld)\n",
+                newMapSize * (unsigned long) sizeof(AtomListPtr));
+        return FALSE;
+    }
+    reverseMap = newMap;
+    reverseMapSize = newMapSize;
+    return TRUE;
+}
+
+static int
+NameEqual(const char *a, const char *b, int l)
+{
+    while (l--)
+        if (*a++ != *b++)
+            return FALSE;
+    return TRUE;
+}
+
+Atom
+__libxfont_internal__MakeAtom(const char *string, unsigned len, int makeit)
+{
+    AtomListPtr a;
+    int hash;
+    int h = 0;
+    int r;
+
+    hash = Hash(string, len);
+    if (hashTable) {
+        h = hash & hashMask;
+        if (hashTable[h]) {
+            if (hashTable[h]->hash == hash && hashTable[h]->len == len &&
+                NameEqual(hashTable[h]->name, string, len)) {
+                return hashTable[h]->atom;
+            }
+            r = (hash % rehash) | 1;
+            for (;;) {
+                h += r;
+                if (h >= hashSize)
+                    h -= hashSize;
+                if (!hashTable[h])
+                    break;
+                if (hashTable[h]->hash == hash && hashTable[h]->len == len &&
+                    NameEqual(hashTable[h]->name, string, len)) {
+                    return hashTable[h]->atom;
+                }
+            }
+        }
+    }
+    if (!makeit)
+        return None;
+    a = malloc(sizeof(AtomListRec) + len + 1);
+    if (a == NULL) {
+        fprintf(stderr, "MakeAtom(): Error: Couldn't allocate AtomListRec"
+                " (%ld)\n", (unsigned long) sizeof(AtomListRec) + len + 1);
+        return None;
+    }
+    a->name = (char *) (a + 1);
+    a->len = len;
+    strncpy(a->name, string, len);
+    a->name[len] = '\0';
+    a->atom = ++lastAtom;
+    a->hash = hash;
+    if (hashUsed >= hashSize / 2) {
+        ResizeHashTable();
+        h = hash & hashMask;
+        if (hashTable[h]) {
+            r = (hash % rehash) | 1;
+            do {
+                h += r;
+                if (h >= hashSize)
+                    h -= hashSize;
+            } while (hashTable[h]);
+        }
+    }
+    hashTable[h] = a;
+    hashUsed++;
+    if (reverseMapSize <= a->atom) {
+        if (!ResizeReverseMap())
+            return None;
+    }
+    reverseMap[a->atom] = a;
+    return a->atom;
+}
+
+int
+__libxfont_internal__ValidAtom(Atom atom)
+{
+    return (atom != None) && (atom <= lastAtom);
+}
+
+const char *
+__libxfont_internal__NameForAtom(Atom atom)
+{
+    if (atom != None && atom <= lastAtom)
+        return reverseMap[atom]->name;
+    return NULL;
+}
diff --git a/src/stubs/cauthgen.c b/src/stubs/cauthgen.c
deleted file mode 100644
index 10086e4..0000000
--- a/src/stubs/cauthgen.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "stubs.h"
-
-#ifdef __SUNPRO_C
-#pragma weak client_auth_generation
-#endif
-
-weak int
-client_auth_generation(ClientPtr client)
-{
-    OVERRIDE_SYMBOL(client_auth_generation, client);
-    return 0;
-}
diff --git a/src/stubs/csignal.c b/src/stubs/csignal.c
deleted file mode 100644
index dd88b3d..0000000
--- a/src/stubs/csignal.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "stubs.h"
-
-#ifdef __SUNPRO_C
-#pragma weak ClientSignal
-#endif
-
-weak Bool
-ClientSignal(ClientPtr client)
-{
-    OVERRIDE_SYMBOL(ClientSignal,client);
-    return True;
-}
diff --git a/src/stubs/delfntcid.c b/src/stubs/delfntcid.c
deleted file mode 100644
index 8113b9f..0000000
--- a/src/stubs/delfntcid.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "stubs.h"
-
-#ifdef __SUNPRO_C
-#pragma weak DeleteFontClientID
-#endif
-
-weak void
-DeleteFontClientID(Font id)
-{
-    OVERRIDE_SYMBOL(DeleteFontClientID, id);
-}
diff --git a/src/stubs/errorf.c b/src/stubs/errorf.c
deleted file mode 100644
index d2de6c6..0000000
--- a/src/stubs/errorf.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "stubs.h"
-
-#ifdef __SUNPRO_C
-#pragma weak ErrorF
-#endif
-
-weak void
-ErrorF(const char *f, ...)
-{
-    OVERRIDE_VA_SYMBOL(VErrorF, f);
-}
diff --git a/src/stubs/findoldfnt.c b/src/stubs/findoldfnt.c
deleted file mode 100644
index c73279e..0000000
--- a/src/stubs/findoldfnt.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "stubs.h"
-
-#ifdef __SUNPRO_C
-#pragma weak find_old_font
-#endif
-
-weak FontPtr
-find_old_font(FSID id)
-{
-    OVERRIDE_SYMBOL(find_old_font, id);
-    return (FontPtr)NULL;
-}
diff --git a/src/stubs/getcres.c b/src/stubs/getcres.c
deleted file mode 100644
index 27a9180..0000000
--- a/src/stubs/getcres.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "stubs.h"
-
-#ifdef __SUNPRO_C
-#pragma weak GetClientResolutions
-#endif
-
-weak FontResolutionPtr
-GetClientResolutions(int *num)
-{
-  OVERRIDE_SYMBOL(GetClientResolutions, num);
-  return (FontResolutionPtr) 0;
-}
diff --git a/src/stubs/getdefptsize.c b/src/stubs/getdefptsize.c
deleted file mode 100644
index 50c1b18..0000000
--- a/src/stubs/getdefptsize.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "stubs.h"
-
-#ifdef __SUNPRO_C
-#pragma weak GetDefaultPointSize
-#endif
-
-weak int
-GetDefaultPointSize(void)
-{
-    OVERRIDE_SYMBOL(GetDefaultPointSize);
-    return 0;
-}
diff --git a/src/stubs/getnewfntcid.c b/src/stubs/getnewfntcid.c
deleted file mode 100644
index d31ccf1..0000000
--- a/src/stubs/getnewfntcid.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "stubs.h"
-
-#ifdef __SUNPRO_C
-#pragma weak GetNewFontClientID
-#endif
-
-weak Font
-GetNewFontClientID(void)
-{
-    OVERRIDE_SYMBOL(GetNewFontClientID);
-    return (Font)0;
-}
diff --git a/src/stubs/gettime.c b/src/stubs/gettime.c
deleted file mode 100644
index 1b20f62..0000000
--- a/src/stubs/gettime.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "stubs.h"
-
-#ifdef __SUNPRO_C
-#pragma weak GetTimeInMillis
-#endif
-
-weak unsigned long
-GetTimeInMillis (void)
-{
-    OVERRIDE_SYMBOL(GetTimeInMillis);
-    return 0;
-}
diff --git a/src/stubs/initfshdl.c b/src/stubs/initfshdl.c
deleted file mode 100644
index e1c0b24..0000000
--- a/src/stubs/initfshdl.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "stubs.h"
-
-#ifdef __SUNPRO_C
-#pragma weak init_fs_handlers
-#endif
-
-weak int
-init_fs_handlers(FontPathElementPtr fpe,
-                 BlockHandlerProcPtr block_handler)
-{
-  OVERRIDE_SYMBOL(init_fs_handlers, fpe, block_handler);
-  return Successful;
-}
diff --git a/src/stubs/libxfontstubs.c b/src/stubs/libxfontstubs.c
new file mode 100644
index 0000000..f72caec
--- /dev/null
+++ b/src/stubs/libxfontstubs.c
@@ -0,0 +1,169 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include	"libxfontint.h"
+
+static font_client_funcs_rec const *_f;
+
+int
+client_auth_generation(ClientPtr client)
+{
+    if (_f)
+	return _f->client_auth_generation(client);
+    return 0;
+}
+
+Bool
+ClientSignal(ClientPtr client)
+{
+    if (_f)
+	return _f->client_signal(client);
+    return TRUE;
+}
+
+void
+DeleteFontClientID(Font id)
+{
+    if (_f)
+	_f->delete_font_client_id(id);
+}
+
+void
+ErrorF(const char *f, ...)
+{
+    if (_f) {
+	va_list	ap;
+	va_start(ap, f);
+	_f->verrorf(f, ap);
+	va_end(ap);
+    }
+}
+
+FontPtr
+find_old_font(FSID id)
+{
+    if (_f)
+	return _f->find_old_font(id);
+    return (FontPtr)NULL;
+}
+
+FontResolutionPtr
+GetClientResolutions(int *num)
+{
+    if (_f)
+	return _f->get_client_resolutions(num);
+    return (FontResolutionPtr) 0;
+}
+
+int
+GetDefaultPointSize(void)
+{
+    if (_f)
+	return _f->get_default_point_size();
+    return 12;
+}
+
+Font
+GetNewFontClientID(void)
+{
+    if (_f)
+	return _f->get_new_font_client_id();
+    return (Font)0;
+}
+
+unsigned long
+GetTimeInMillis (void)
+{
+    if (_f)
+	return _f->get_time_in_millis();
+    return 0;
+}
+
+int
+init_fs_handlers(FontPathElementPtr fpe,
+                 BlockHandlerProcPtr block_handler)
+{
+    if (_f)
+	return _f->init_fs_handlers(fpe, block_handler);
+    return Successful;
+}
+
+int
+register_fpe_funcs(const font_fpe_funcs_rec *funcs)
+{
+    if (_f)
+	return _f->register_fpe_funcs(funcs);
+    return 0;
+}
+
+void
+remove_fs_handlers(FontPathElementPtr fpe,
+                   BlockHandlerProcPtr blockHandler,
+                   Bool all)
+{
+    if (_f)
+	_f->remove_fs_handlers(fpe, blockHandler, all);
+}
+
+void *
+__GetServerClient(void)
+{
+    if (_f)
+	return _f->get_server_client();
+    return NULL;
+}
+
+int
+set_font_authorizations(char **authorizations, int *authlen, ClientPtr client)
+{
+    if (_f)
+	return _f->set_font_authorizations(authorizations, authlen, client);
+    return 0;
+}
+
+int
+StoreFontClientFont(FontPtr pfont, Font id)
+{
+    if (_f)
+	return _f->store_font_client_font(pfont, id);
+    return 0;
+}
+
+Atom
+MakeAtom(const char *string, unsigned len, int makeit)
+{
+    if (_f && _f->make_atom)
+	return _f->make_atom(string, len, makeit);
+    return __libxfont_internal__MakeAtom(string, len, makeit);
+}
+
+int
+ValidAtom(Atom atom)
+{
+    if (_f && _f->valid_atom)
+	return _f->valid_atom(atom);
+    return __libxfont_internal__ValidAtom(atom);
+}
+
+const char *
+NameForAtom(Atom atom)
+{
+    if (_f && _f->name_for_atom)
+	return _f->name_for_atom(atom);
+    return __libxfont_internal__NameForAtom(atom);
+}
+
+unsigned long
+__GetServerGeneration (void)
+{
+    if (_f)
+	return _f->get_server_generation();
+    return 1;
+}
+
+void
+font_register_client_funcs(font_client_funcs_rec const *client_funcs)
+{
+    _f = client_funcs;
+}
diff --git a/src/stubs/regfpefunc.c b/src/stubs/regfpefunc.c
deleted file mode 100644
index ae12a01..0000000
--- a/src/stubs/regfpefunc.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "stubs.h"
-
-#ifdef __SUNPRO_C
-#pragma weak RegisterFPEFunctions
-#endif
-
-weak int
-RegisterFPEFunctions(NameCheckFunc name_func,
-		     InitFpeFunc init_func,
-		     FreeFpeFunc free_func,
-		     ResetFpeFunc reset_func,
-		     OpenFontFunc open_func,
-		     CloseFontFunc close_func,
-		     ListFontsFunc list_func,
-		     StartLfwiFunc start_lfwi_func,
-		     NextLfwiFunc next_lfwi_func,
-		     WakeupFpeFunc wakeup_func,
-		     ClientDiedFunc client_died,
-		     LoadGlyphsFunc load_glyphs,
-		     StartLaFunc start_list_alias_func,
-		     NextLaFunc next_list_alias_func,
-		     SetPathFunc set_path_func)
-{
-    OVERRIDE_SYMBOL(RegisterFPEFunctions, name_func, init_func, free_func,
-                    reset_func, open_func, close_func, list_func, start_lfwi_func,
-                    next_lfwi_func, wakeup_func, client_died, load_glyphs,
-                    start_list_alias_func, next_list_alias_func, set_path_func);
-    return 0;
-}
diff --git a/src/stubs/rmfshdl.c b/src/stubs/rmfshdl.c
deleted file mode 100644
index 22a3091..0000000
--- a/src/stubs/rmfshdl.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "stubs.h"
-
-#ifdef __SUNPRO_C
-#pragma weak remove_fs_handlers
-#endif
-
-weak void
-remove_fs_handlers(FontPathElementPtr fpe,
-                   BlockHandlerProcPtr blockHandler,
-                   Bool all)
-{
-    OVERRIDE_SYMBOL(remove_fs_handlers, fpe, blockHandler, all);
-}
diff --git a/src/stubs/servclient.c b/src/stubs/servclient.c
deleted file mode 100644
index f85e08e..0000000
--- a/src/stubs/servclient.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "stubs.h"
-
-#ifdef __SUNPRO_C
-#pragma weak serverClient
-#endif
-
-weak void *serverClient = 0;
-
-void *__GetServerClient(void);
-
-void *
-__GetServerClient(void)
-{
-   OVERRIDE_DATA(serverClient);
-   return serverClient;
-}
diff --git a/src/stubs/setfntauth.c b/src/stubs/setfntauth.c
deleted file mode 100644
index 371807e..0000000
--- a/src/stubs/setfntauth.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "stubs.h"
-
-#ifdef __SUNPRO_C
-#pragma weak set_font_authorizations
-#endif
-
-weak int
-set_font_authorizations(char **authorizations, int *authlen, ClientPtr client)
-{
-    OVERRIDE_SYMBOL(set_font_authorizations, authorizations, authlen, client);
-    return 0;
-}
diff --git a/src/stubs/stfntcfnt.c b/src/stubs/stfntcfnt.c
deleted file mode 100644
index d490988..0000000
--- a/src/stubs/stfntcfnt.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "stubs.h"
-
-#ifdef __SUNPRO_C
-#pragma weak StoreFontClientFont
-#endif
-
-weak int
-StoreFontClientFont(FontPtr pfont, Font id)
-{
-    OVERRIDE_SYMBOL(StoreFontClientFont, pfont, id);
-    return 0;
-}
diff --git a/src/stubs/stubs.h b/src/stubs/stubs.h
deleted file mode 100644
index 7d499d5..0000000
--- a/src/stubs/stubs.h
+++ /dev/null
@@ -1,88 +0,0 @@
-#include <stdio.h>
-#include <X11/fonts/fntfilst.h>
-#include <X11/fonts/font.h>
-
-#ifndef True
-#define True (-1)
-#endif
-#ifndef False
-#define False (0)
-#endif
-
-/* this probably works for Mach-O too, but probably not for PE */
-#if (defined(__APPLE__) || defined(__ELF__)) && defined(__GNUC__) && (__GNUC__ >= 3)
-#define weak __attribute__((weak))
-#else
-#define weak
-#ifndef __SUNPRO_C /* Sun compilers use #pragma weak in .c files instead */
-#define NO_WEAK_SYMBOLS
-#endif
-#endif
-
-#if defined(NO_WEAK_SYMBOLS) && defined(PIC)
-#include <stdarg.h>
-extern int _font_init_stubs(void);
-#define OVERRIDE_DATA(sym) \
-    _font_init_stubs(); \
-    if (__ptr_##sym && __ptr_##sym != &sym) \
-      sym = *__ptr_##sym
-#define OVERRIDE_SYMBOL(sym,...) \
-    _font_init_stubs(); \
-    if (__##sym && __##sym != sym) \
-      return (*__##sym)(__VA_ARGS__)
-#define OVERRIDE_VA_SYMBOL(sym,f) \
-    va_list _args; \
-    _font_init_stubs(); \
-    va_start(_args, f); \
-    if (__##sym) \
-      (*__##sym)(f, _args); \
-    va_end(_args)
-
-int (*__client_auth_generation)(ClientPtr);
-Bool (*__ClientSignal)(ClientPtr);
-void (*__DeleteFontClientID)(Font);
-void (*__VErrorF)(const char *, va_list);
-FontPtr (*__find_old_font)(FSID);
-FontResolutionPtr (*__GetClientResolutions)(int *);
-int (*__GetDefaultPointSize)(void);
-Font (*__GetNewFontClientID)(void);
-unsigned long (*__GetTimeInMillis)(void);
-int (*__init_fs_handlers)(FontPathElementPtr, BlockHandlerProcPtr);
-int (*__RegisterFPEFunctions)(NameCheckFunc, InitFpeFunc, FreeFpeFunc,
-     ResetFpeFunc, OpenFontFunc, CloseFontFunc, ListFontsFunc,
-     StartLfwiFunc, NextLfwiFunc, WakeupFpeFunc, ClientDiedFunc,
-     LoadGlyphsFunc, StartLaFunc, NextLaFunc, SetPathFunc);
-void (*__remove_fs_handlers)(FontPathElementPtr, BlockHandlerProcPtr, Bool);
-void **__ptr_serverClient;
-int (*__set_font_authorizations)(char **, int *, ClientPtr);
-int (*__StoreFontClientFont)(FontPtr, Font);
-Atom (*__MakeAtom)(const char *, unsigned, int);
-int (*__ValidAtom)(Atom);
-char *(*__NameForAtom)(Atom);
-unsigned long *__ptr_serverGeneration;
-void (*__register_fpe_functions)(void);
-#else /* NO_WEAK_SYMBOLS && PIC */
-#define OVERRIDE_DATA(sym)
-#define OVERRIDE_SYMBOL(sym,...)
-#define OVERRIDE_VA_SYMBOL(sym,f)
-#endif
-
-/* This is really just a hack for now... __APPLE__ really should be using
- * the weak symbols route above, but it's causing an as-yet unresolved issue,
- * so we're instead building with flat_namespace.
- */
-#ifdef __APPLE__
-#undef weak
-#define weak
-#endif
-
-extern FontPtr find_old_font ( FSID id );
-extern int set_font_authorizations ( char **authorizations,
-				     int *authlen,
-				     ClientPtr client );
-
-extern unsigned long GetTimeInMillis (void);
-
-extern void ErrorF(const char *format, ...);
-
-/* end of file */
diff --git a/src/stubs/stubsinit.c b/src/stubs/stubsinit.c
deleted file mode 100644
index fc52332..0000000
--- a/src/stubs/stubsinit.c
+++ /dev/null
@@ -1,82 +0,0 @@
-#include "stubs.h"
-
-#if defined(NO_WEAK_SYMBOLS) && defined(PIC)
-
-#ifdef WIN32
-#include <X11/Xwindows.h>
-#define DLOPEN_SELF() GetModuleHandle(NULL)
-#define DLSYM(h,f) GetProcAddress(h,f)
-#else
-#include <dlfcn.h>
-#define DLOPEN_SELF() dlopen(NULL, RTLD_LOCAL)
-#define DLSYM(h,f) dlsym(h, f)
-#endif
-
-int (*__client_auth_generation)(ClientPtr) = NULL;
-Bool (*__ClientSignal)(ClientPtr) = NULL;
-void (*__DeleteFontClientID)(Font) = NULL;
-void (*__VErrorF)(const char *, va_list) = NULL;
-FontPtr (*__find_old_font)(FSID) = NULL;
-FontResolutionPtr (*__GetClientResolutions)(int *) = NULL;
-int (*__GetDefaultPointSize)(void) = NULL;
-Font (*__GetNewFontClientID)(void) = NULL;
-unsigned long (*__GetTimeInMillis)(void) = NULL;
-int (*__init_fs_handlers)(FontPathElementPtr, BlockHandlerProcPtr) = NULL;
-int (*__RegisterFPEFunctions)(NameCheckFunc, InitFpeFunc, FreeFpeFunc,
-     ResetFpeFunc, OpenFontFunc, CloseFontFunc, ListFontsFunc,
-     StartLfwiFunc, NextLfwiFunc, WakeupFpeFunc, ClientDiedFunc,
-     LoadGlyphsFunc, StartLaFunc, NextLaFunc, SetPathFunc) = NULL;
-void (*__remove_fs_handlers)(FontPathElementPtr, BlockHandlerProcPtr, Bool) = NULL;
-void **__ptr_serverClient = NULL;
-int (*__set_font_authorizations)(char **, int *, ClientPtr) = NULL;
-int (*__StoreFontClientFont)(FontPtr, Font) = NULL;
-Atom (*__MakeAtom)(const char *, unsigned, int) = NULL;
-int (*__ValidAtom)(Atom) = NULL;
-char *(*__NameForAtom)(Atom) = NULL;
-unsigned long *__ptr_serverGeneration = NULL;
-void (*__register_fpe_functions)(void) = NULL;
-
-#define INIT_SYMBOL(sym) \
-  if (!__##sym) \
-   __##sym = (typeof(__##sym)) DLSYM(handle, #sym)
-#define INIT_DATA(sym) \
-  if (!__ptr_##sym) \
-   __ptr_##sym = (typeof(__ptr_##sym)) DLSYM(handle, #sym)
-
-int
-_font_init_stubs (void)
-{
-  static int inited = FALSE;
-  static void *handle = NULL;
-
-  if (inited)
-    return inited;
-  if (!handle)
-    handle = DLOPEN_SELF();
-
-  INIT_SYMBOL(client_auth_generation);
-  INIT_SYMBOL(ClientSignal);
-  INIT_SYMBOL(DeleteFontClientID);
-  INIT_SYMBOL(VErrorF);
-  INIT_SYMBOL(find_old_font);
-  INIT_SYMBOL(GetClientResolutions);
-  INIT_SYMBOL(GetDefaultPointSize);
-  INIT_SYMBOL(GetNewFontClientID);
-  INIT_SYMBOL(GetTimeInMillis);
-  INIT_SYMBOL(init_fs_handlers);
-  INIT_SYMBOL(RegisterFPEFunctions);
-  INIT_SYMBOL(remove_fs_handlers);
-  INIT_SYMBOL(set_font_authorizations);
-  INIT_SYMBOL(StoreFontClientFont);
-  INIT_SYMBOL(MakeAtom);
-  INIT_SYMBOL(ValidAtom);
-  INIT_SYMBOL(NameForAtom);
-  INIT_SYMBOL(register_fpe_functions);
-  INIT_DATA(serverClient);
-  INIT_DATA(serverGeneration);
-
-  inited = TRUE;
-  return inited;
-}
-
-#endif /* NO_WEAK_SYMBOLS && PIC */
diff --git a/src/util/Makefile.am b/src/util/Makefile.am
index 32a8f37..d802b59 100644
--- a/src/util/Makefile.am
+++ b/src/util/Makefile.am
@@ -7,7 +7,6 @@ AM_CFLAGS = $(XFONT_CFLAGS) $(OS_CFLAGS) $(CWARNFLAGS)
 noinst_LTLIBRARIES = libutil.la
 
 libutil_la_SOURCES = 		\
-	atom.c			\
 	fontaccel.c		\
 	fontnames.c		\
 	fontutil.c		\
diff --git a/src/util/atom.c b/src/util/atom.c
deleted file mode 100644
index 5f7f1c6..0000000
--- a/src/util/atom.c
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
-
-Copyright 1990, 1994, 1998  The Open Group
-
-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.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-*/
-
-/*
- * Author:  Keith Packard, MIT X Consortium
- */
-
-/* lame atom replacement routines for font applications */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include <X11/fonts/fontmisc.h>
-#include "stubs.h"
-
-typedef struct _AtomList {
-    char		*name;
-    int			len;
-    int			hash;
-    Atom		atom;
-} AtomListRec, *AtomListPtr;
-
-static AtomListPtr  *hashTable;
-
-static int	    hashSize, hashUsed;
-static int	    hashMask;
-static int	    rehash;
-
-static AtomListPtr  *reverseMap;
-static int	    reverseMapSize;
-static Atom	    lastAtom;
-
-static int
-Hash(const char *string, int len)
-{
-    int	h;
-
-    h = 0;
-    while (len--)
-	h = (h << 3) ^ *string++;
-    if (h < 0)
-	return -h;
-    return h;
-}
-
-static int
-ResizeHashTable (void)
-{
-    int		newHashSize;
-    int		newHashMask;
-    AtomListPtr	*newHashTable;
-    int		i;
-    int		h;
-    int		newRehash;
-    int		r;
-
-    if (hashSize == 0)
-	newHashSize = 1024;
-    else
-	newHashSize = hashSize * 2;
-    newHashTable = calloc (newHashSize, sizeof (AtomListPtr));
-    if (!newHashTable) {
-	fprintf(stderr, "ResizeHashTable(): Error: Couldn't allocate"
-		" newHashTable (%ld)\n",
-		newHashSize * (unsigned long)sizeof (AtomListPtr));
-	return FALSE;
-    }
-    newHashMask = newHashSize - 1;
-    newRehash = (newHashMask - 2);
-    for (i = 0; i < hashSize; i++)
-    {
-	if (hashTable[i])
-	{
-	    h = (hashTable[i]->hash) & newHashMask;
-	    if (newHashTable[h])
-	    {
-		r = hashTable[i]->hash % newRehash | 1;
-		do {
-		    h += r;
-		    if (h >= newHashSize)
-			h -= newHashSize;
-		} while (newHashTable[h]);
-	    }
-	    newHashTable[h] = hashTable[i];
-	}
-    }
-    free (hashTable);
-    hashTable = newHashTable;
-    hashSize = newHashSize;
-    hashMask = newHashMask;
-    rehash = newRehash;
-    return TRUE;
-}
-
-static int
-ResizeReverseMap (void)
-{
-    AtomListPtr *newMap;
-    int newMapSize;
-
-    if (reverseMapSize == 0)
-	newMapSize = 1000;
-    else
-	newMapSize = reverseMapSize * 2;
-    newMap = realloc (reverseMap, newMapSize * sizeof (AtomListPtr));
-    if (newMap == NULL) {
-	fprintf(stderr, "ResizeReverseMap(): Error: Couldn't reallocate"
-		" reverseMap (%ld)\n",
-		newMapSize * (unsigned long)sizeof(AtomListPtr));
-	return FALSE;
-    }
-    reverseMap = newMap;
-    reverseMapSize = newMapSize;
-    return TRUE;
-}
-
-static int
-NameEqual (const char *a, const char *b, int l)
-{
-    while (l--)
-	if (*a++ != *b++)
-	    return FALSE;
-    return TRUE;
-}
-
-#ifdef __SUNPRO_C
-#pragma weak MakeAtom
-#endif
-
-weak Atom
-MakeAtom(const char *string, unsigned len, int makeit)
-{
-    AtomListPtr	a;
-    int		hash;
-    int		h = 0;
-    int		r;
-
-    OVERRIDE_SYMBOL(MakeAtom, string, len, makeit);
-
-    hash = Hash (string, len);
-    if (hashTable)
-    {
-    	h = hash & hashMask;
-	if (hashTable[h])
-	{
-	    if (hashTable[h]->hash == hash && hashTable[h]->len == len &&
-	    	NameEqual (hashTable[h]->name, string, len))
-	    {
-	    	return hashTable[h]->atom;
-	    }
-	    r = (hash % rehash) | 1;
-	    for (;;)
-	    {
-		h += r;
-		if (h >= hashSize)
-		    h -= hashSize;
-		if (!hashTable[h])
-		    break;
-		if (hashTable[h]->hash == hash && hashTable[h]->len == len &&
-		    NameEqual (hashTable[h]->name, string, len))
-		{
-		    return hashTable[h]->atom;
-		}
-	    }
-    	}
-    }
-    if (!makeit)
-	return None;
-    a = malloc (sizeof (AtomListRec) + len + 1);
-    if (a == NULL) {
-	fprintf(stderr, "MakeAtom(): Error: Couldn't allocate AtomListRec"
-		" (%ld)\n", (unsigned long)sizeof (AtomListRec) + len + 1);
-	return None;
-    }
-    a->name = (char *) (a + 1);
-    a->len = len;
-    strncpy (a->name, string, len);
-    a->name[len] = '\0';
-    a->atom = ++lastAtom;
-    a->hash = hash;
-    if (hashUsed >= hashSize / 2)
-    {
-	ResizeHashTable ();
-	h = hash & hashMask;
-	if (hashTable[h])
-	{
-	    r = (hash % rehash) | 1;
-	    do {
-		h += r;
-		if (h >= hashSize)
-		    h -= hashSize;
-	    } while (hashTable[h]);
-	}
-    }
-    hashTable[h] = a;
-    hashUsed++;
-    if (reverseMapSize <= a->atom) {
-	if (!ResizeReverseMap())
-	    return None;
-    }
-    reverseMap[a->atom] = a;
-    return a->atom;
-}
-
-#ifdef __SUNPRO_C
-#pragma weak ValidAtom
-#endif
-
-weak int
-ValidAtom(Atom atom)
-{
-    OVERRIDE_SYMBOL(ValidAtom, atom);
-    return (atom != None) && (atom <= lastAtom);
-}
-
-#ifdef __SUNPRO_C
-#pragma weak NameForAtom
-#endif
-
-weak char *
-NameForAtom(Atom atom)
-{
-    OVERRIDE_SYMBOL(NameForAtom, atom);
-    if (atom != None && atom <= lastAtom)
-	return reverseMap[atom]->name;
-    return NULL;
-}
diff --git a/src/util/fontaccel.c b/src/util/fontaccel.c
index db03e73..c8395c4 100644
--- a/src/util/fontaccel.c
+++ b/src/util/fontaccel.c
@@ -33,6 +33,7 @@ from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include    <X11/fonts/fontmisc.h>
 #include    <X11/fonts/fontstruct.h>
 #include    <X11/fonts/fontutil.h>
diff --git a/src/util/fontnames.c b/src/util/fontnames.c
index ceafce5..dd50f2b 100644
--- a/src/util/fontnames.c
+++ b/src/util/fontnames.c
@@ -34,6 +34,7 @@ from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include	<X11/fonts/fontmisc.h>
 #include	<X11/fonts/fontstruct.h>
 
diff --git a/src/util/fontutil.c b/src/util/fontutil.c
index 2c5ea6f..7b69c33 100644
--- a/src/util/fontutil.c
+++ b/src/util/fontutil.c
@@ -33,6 +33,7 @@ from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include    <X11/fonts/fontmisc.h>
 #include    <X11/fonts/fontstruct.h>
 #include    <X11/fonts/FSproto.h>
diff --git a/src/util/fontxlfd.c b/src/util/fontxlfd.c
index 974128e..c8f9596 100644
--- a/src/util/fontxlfd.c
+++ b/src/util/fontxlfd.c
@@ -33,6 +33,7 @@ from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include	<X11/fonts/fontmisc.h>
 #include	<X11/fonts/fontstruct.h>
 #include	<X11/fonts/fontxlfd.h>
diff --git a/src/util/format.c b/src/util/format.c
index c1f9762..0baeb3a 100644
--- a/src/util/format.c
+++ b/src/util/format.c
@@ -53,6 +53,7 @@ from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include	<X11/fonts/FSproto.h>
 #include	<X11/fonts/font.h>
 #include	<X11/fonts/fontstruct.h>
diff --git a/src/util/miscutil.c b/src/util/miscutil.c
index 61c9d11..e015972 100644
--- a/src/util/miscutil.c
+++ b/src/util/miscutil.c
@@ -29,38 +29,19 @@ from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include <X11/Xosdefs.h>
 #include <stdlib.h>
 #include <X11/fonts/fontmisc.h>
-#include "stubs.h"
 
 #define XK_LATIN1
 #include    <X11/keysymdef.h>
 
-
-#ifdef __SUNPRO_C
-#pragma weak serverGeneration
-#pragma weak register_fpe_functions
-#endif
-
 extern void BuiltinRegisterFpeFunctions(void);
 
-/* make sure everything initializes themselves at least once */
-weak unsigned long serverGeneration = 1;
-
-unsigned long __GetServerGeneration (void);
-
-unsigned long
-__GetServerGeneration (void)
-{
-  OVERRIDE_DATA(serverGeneration);
-  return serverGeneration;
-}
-
-weak void
+void
 register_fpe_functions (void)
 {
-    OVERRIDE_SYMBOL(register_fpe_functions);
     BuiltinRegisterFpeFunctions();
     FontFileRegisterFpeFunctions();
 #ifdef XFONT_FC
diff --git a/src/util/patcache.c b/src/util/patcache.c
index 2101015..29e2d75 100644
--- a/src/util/patcache.c
+++ b/src/util/patcache.c
@@ -31,6 +31,7 @@ in this Software without prior written authorization from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include    <X11/fonts/fontmisc.h>
 #include    <X11/fonts/fontstruct.h>
 
diff --git a/src/util/private.c b/src/util/private.c
index e55e193..f4f2d57 100644
--- a/src/util/private.c
+++ b/src/util/private.c
@@ -31,6 +31,7 @@ in this Software without prior written authorization from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include    <X11/fonts/fontmisc.h>
 #include    <X11/fonts/fontstruct.h>
 
diff --git a/src/util/utilbitmap.c b/src/util/utilbitmap.c
index ec726b8..fe1c412 100644
--- a/src/util/utilbitmap.c
+++ b/src/util/utilbitmap.c
@@ -31,6 +31,7 @@ in this Software without prior written authorization from The Open Group.
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include "libxfontint.h"
 #include <X11/fonts/fontmisc.h>
 
 /* Utility functions for reformating font bitmaps */
diff --git a/xfont.pc.in b/xfont.pc.in
deleted file mode 100644
index f08dea0..0000000
--- a/xfont.pc.in
+++ /dev/null
@@ -1,13 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: Xfont
-Description: X font Library
-Version: @VERSION@
-Requires: xproto fontsproto
-Requires.private: fontenc @FREETYPE_REQUIRES@
-Cflags: -I${includedir}
-Libs: -L${libdir} -lXfont
-Libs.private: @Z_LIBS@ -lm
diff --git a/xfont2.pc.in b/xfont2.pc.in
new file mode 100644
index 0000000..ac3f53a
--- /dev/null
+++ b/xfont2.pc.in
@@ -0,0 +1,13 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: Xfont2
+Description: X font Library version 2
+Version: @VERSION@
+Requires: xproto fontsproto
+Requires.private: fontenc @FREETYPE_REQUIRES@
+Cflags: -I${includedir}
+Libs: -L${libdir} -lXfont2
+Libs.private: @Z_LIBS@ -lm
-- 
2.5.0



More information about the xorg-devel mailing list