Imported Upstream version 1.2.4 upstream upstream/1.2.4
authorAnas Nashif <anas.nashif@intel.com>
Sun, 4 Nov 2012 20:36:59 +0000 (12:36 -0800)
committerAnas Nashif <anas.nashif@intel.com>
Sun, 4 Nov 2012 20:36:59 +0000 (12:36 -0800)
53 files changed:
COPYING [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
INSTALL [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
README [new file with mode: 0644]
aclocal.m4 [new file with mode: 0644]
action.c [new file with mode: 0644]
action.h [new file with mode: 0644]
alias.c [new file with mode: 0644]
alias.h [new file with mode: 0644]
compat.c [new file with mode: 0644]
compat.h [new file with mode: 0644]
config.guess [new file with mode: 0644]
config.h.in [new file with mode: 0644]
config.sub [new file with mode: 0644]
configure [new file with mode: 0755]
configure.ac [new file with mode: 0644]
depcomp [new file with mode: 0755]
expr.c [new file with mode: 0644]
expr.h [new file with mode: 0644]
geometry.c [new file with mode: 0644]
indicators.c [new file with mode: 0644]
indicators.h [new file with mode: 0644]
install-sh [new file with mode: 0755]
keycodes.c [new file with mode: 0644]
keycodes.h [new file with mode: 0644]
keymap.c [new file with mode: 0644]
keytypes.c [new file with mode: 0644]
listing.c [new file with mode: 0644]
man/Makefile.am [new file with mode: 0644]
man/Makefile.in [new file with mode: 0644]
man/xkbcomp.man [new file with mode: 0644]
misc.c [new file with mode: 0644]
misc.h [new file with mode: 0644]
missing [new file with mode: 0755]
parseutils.c [new file with mode: 0644]
parseutils.h [new file with mode: 0644]
symbols.c [new file with mode: 0644]
tokens.h [new file with mode: 0644]
utils.c [new file with mode: 0644]
utils.h [new file with mode: 0644]
vmod.c [new file with mode: 0644]
vmod.h [new file with mode: 0644]
xkbcomp.c [new file with mode: 0644]
xkbcomp.h [new file with mode: 0644]
xkbcomp.pc.in [new file with mode: 0644]
xkbparse.c [new file with mode: 0644]
xkbparse.y [new file with mode: 0644]
xkbpath.c [new file with mode: 0644]
xkbpath.h [new file with mode: 0644]
xkbscan.c [new file with mode: 0644]
ylwrap [new file with mode: 0755]

diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..fc22e80
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,90 @@
+Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, 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 Silicon Graphics not be 
+used in advertising or publicity pertaining to distribution 
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability 
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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.
+
+
+Copyright 1988, 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.
+
+
+Copyright 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its 
+documentation for any purpose and without fee is hereby granted, 
+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 Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.  
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL 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.
+
+
+                             COPYRIGHT 1990
+                       DIGITAL EQUIPMENT CORPORATION
+                          MAYNARD, MASSACHUSETTS
+                           ALL RIGHTS RESERVED.
+
+THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
+SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
+DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE 
+FOR ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED 
+WARRANTY.
+
+IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT
+RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN
+ADDITION TO THAT SET FORTH ABOVE.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted, 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 Digital Equipment Corporation not be
+used in advertising or publicity pertaining to distribution of the 
+software without specific, written prior permission.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..f65ade2
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,1207 @@
+commit f2eff337176551f643e35c54c1e1ca0a78df69c6
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Mar 22 22:02:56 2012 -0700
+
+    xkbcomp 1.2.4
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit b4fafc4fa7edc4c04c3c0affae0d7f79a63e8d2f
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Wed Dec 28 20:57:55 2011 -0800
+
+    Delete redundant redeclarations of extern Atoms in symbols.c
+    
+    Fixes gcc warnings of:
+    
+    symbols.c:43: warning: redundant redeclaration of 'tok_ONE_LEVEL'
+    tokens.h:99: warning: previous declaration of 'tok_ONE_LEVEL' was here
+    symbols.c:44: warning: redundant redeclaration of 'tok_TWO_LEVEL'
+    tokens.h:100: warning: previous declaration of 'tok_TWO_LEVEL' was here
+    symbols.c:45: warning: redundant redeclaration of 'tok_KEYPAD'
+    tokens.h:102: warning: previous declaration of 'tok_KEYPAD' was here
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 3835cae3cb1ad1073cbb2711f938beb878b4986c
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Wed Dec 28 20:53:45 2011 -0800
+
+    Make sure to leave room for trailing nil byte in yyGetNumber
+    
+    ...though really, by the time you've added 1023 digits to the number
+    you want to parse, you've got much bigger problems than an off-by-one
+    error in your buffer count.
+    
+    Fixes parfait warnings:
+       Buffer overflow (CWE 120): In array dereference of (*buf)[nInBuf] with index 'nInBuf'
+          Array size is 1024 bytes, nInBuf >= 1 and nInBuf <= 1024
+            at line 625 of xkbscan.c in function 'yyGetNumber'.
+       Buffer overflow (CWE 120): In array dereference of (*buf)[nInBuf] with index 'nInBuf'
+          Array size is 1024 bytes, nInBuf <= 1025
+            at line 632 of xkbscan.c in function 'yyGetNumber'.
+    
+    [ This bug was found by the Parfait 0.4.2 bug checking tool.
+      For more information see http://labs.oracle.com/projects/parfait/ ]
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 1447071942dbbbfc37b08417c74c8a1d302c1626
+Author: Andreas Wettstein <wettstein509@solnet.ch>
+Date:   Fri Dec 2 20:10:06 2011 +0000
+
+    include resets group compatibility modifiers #43091
+    
+    This change makes sure that include does not overwrite previous
+    compatibility modifier settings when the included files does not
+    explicitly specify them.
+    
+    Signed-off-by: Andreas Wettstein <wettstein509@solnet.ch>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+
+commit 5fd14db5b2cc0c2c43f7a1ddefd6f9991eb1dcc2
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Fri Nov 11 11:18:43 2011 -0800
+
+    Silence -Wparentheses-equality
+    
+    warning: equality comparison with extraneous parentheses [-Wparentheses-equality]
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 6099655a4bbe1fd3e26b8afd2b91888ad2766086
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Fri Nov 11 11:17:38 2011 -0800
+
+    Silence -Wshadow warnings
+    
+    warning: declaration shadows a local variable [-Wshadow]
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit b7e88debd937be147d3581b9c8720c0bfe354052
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Fri Nov 11 11:13:42 2011 -0800
+
+    Correct our zeroing out of the row in InitRowInfo
+    
+    geometry.c:369:20: warning: argument to 'sizeof' in '__builtin___memset_chk' call is the same
+          pointer type 'RowInfo *' (aka 'struct _RowInfo *') as the destination; expected 'RowInfo'
+          (aka 'struct _RowInfo') or an explicit length [-Wsizeof-pointer-memaccess]
+            bzero(row, sizeof(RowInfo *));
+            ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 33b5c9413463613d341d15184b34a4f4c4e70e56
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Fri Nov 11 11:12:22 2011 -0800
+
+    Fix -Wformat warnings
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit b9f6482d5fc413222334c2370ef8b9693f4b50fd
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Fri Nov 11 11:07:30 2011 -0800
+
+    Add missing _X_NORETURN to uFatalError
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 8ea06128c70b07c265a217222f2a245aad4bfce4
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Fri Nov 11 11:06:02 2011 -0800
+
+    Include strings.h for strcasecmp and string.h for strdup
+    
+    Our minimum requirement for X11 is currently Unix98.  Unix98 provides
+    strcasecmp in <strings.h>.  This commit fixes implicit declarations
+    of this function on systems that closely adhere to the standard.
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 89c8317ad84386f69d31f38dcddbc7ff0abffb31
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Tue Jul 5 08:23:37 2011 +1000
+
+    Add .pc file for version export
+    
+    Exports xkbcomp version and the xkb base directory.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+    Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit cdb8677f370b34a3a523a32ae0023c7e8c0c965c
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Jun 22 10:41:33 2011 +1000
+
+    Print version number on -version.
+    
+    This commit isn't playing the WARN/M/M1 macro game. Version numbers to to
+    stdout, full stop.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit cef4ba4b8fdc9a5439f71437c08cf690a750bd6b
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Jun 21 16:04:45 2011 +0100
+
+    Bump to 1.2.3
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit 3caab5aa37decb7b5dc1642a0452efc3e1f5100e
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Jun 21 15:55:59 2011 +0100
+
+    Interp: Allow explicit Any/NoSymbol mappings
+    
+    Brown paper bag in full effect.
+    
+    The previous fix, while crushing the previous problem where an unknown
+    keysym for an interp def would lead to every key matching it, also
+    ignored explicit Any+AnyOfOrNone(All) mappings.
+    
+    Such as the one xkeyboard-config relied on for Control to actually
+    update the modifier state.
+    
+    Fix this by allowing mappings explicitly declared as Any/NoSymbol, while
+    ignoring only those with failed keysym lookups.  Unfortunately, due to
+    the structure of the parser, it's a deeply inelegant fix.
+    
+    Verified with a quick check of all layouts (albeit using default
+    variants only) in xkeyboard-config that this results in no changes to
+    the output at all, compared to xkbcomp 1.1.1.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit b34af8b0aec3a1dfc58f9732996274cbf2646a53
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Jun 21 15:55:28 2011 +0100
+
+    Constify LookupKeysym input argument
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit e68a8ef1067f98056237d8067052e2a0d9896133
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Jun 21 14:06:05 2011 +0100
+
+    Bump to 1.2.2
+    
+    Emergency bugfix for the syminterp declarations.  They've been broken
+    since the beginning of time, but I guess we just haven't added new
+    interpreted symbols since around then.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit 2a473b906943ffd807ad81960c47530ee7ae9a60
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Jun 21 14:03:53 2011 +0100
+
+    Interp: Ignore NoSymbol definitions
+    
+    A NoSymbol syminterp leads to a Any+AnyOfOrAll(None) definition, which
+    is never what anyone would actually ever want in a sym interp.  The
+    failure mode here was:
+        interpret XF86SomeKeysymYouDontHaveYet {
+            action=Something()
+        }
+    leading to:
+        interpret Any+AnyOfOrAll(None) {
+            action=Something()
+        }
+    leading to every single non-action key triggering your shiny new action
+    that was only supposed to come from a new keysym.
+    
+    At least you could VT switch or zap, I guess.
+    
+    Later, more invasive, revisions will bring a more useful error message.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit a2816345e58c88f5806a5c6df310c7d9c62264f0
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Jun 21 14:03:12 2011 +0100
+
+    Interp: Don't make modifier lookup failure fatal
+    
+    If we can't look up a modifier in a SymInterp declaration, don't make
+    that fatal enough to kill the entire file, just ignore it and move on.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit c7a42b364f0ca06d9859945fa11664d0e0ea2742
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Mar 8 08:16:35 2011 -0500
+
+    config: move pre-processor flags to AM_CPPFLAGS
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 7899a1f4745c8d111dab4dd3abc2b59b40ecdcbc
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Mar 8 08:02:54 2011 -0500
+
+    config: let Automake handle Yacc dist and cleaning
+    
+    BUILT_SOURCES and MAINTAINERCLEANFILES are already handled by Automake.
+    
+    Automake generates all the rules to handle building,
+    distribution and cleaning.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 137418c63d01d5db0dcaed257d7a26865efa53ae
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Jun 7 23:47:32 2011 -0700
+
+    Replace repeated checks for gcc with _X_ATTRIBUTE_PRINTF from xproto
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Mark Kettenis <kettenis@openbsd.org>
+
+commit a2877e92bd9f9c1532b5cd12cc484ff3cdbc6a0a
+Author: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
+Date:   Fri Apr 1 20:26:30 2011 +1100
+
+    xkbcomp: Stop possible overflow in yyGetnumber. #31647
+    
+    Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=31647
+    
+    Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
+    Reviewed-by: Dan Nicholson <dbn.lists@gmail.com>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 0b8527a3836cde77269461e22844857bf33e0aea
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Sun Feb 13 13:03:05 2011 +0100
+
+    Inline the oiText macro in the only place it's used
+    
+    Gets rid of a compiler warning:
+    geometry.c: In function 'HandleOverlayDef':
+    geometry.c:2578: warning: the address of 'ol' will always evaluate as 'true'
+    
+    X.Org bug#34219 <https://bugs.freedesktop.org/show_bug.cgi?id=34219>
+    
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+    Reviewed-by: Dirk Wallenstein <halsmit@t-online.de>
+
+commit c8375bcb7eb9f86ca1534cdf1143e91372d0499e
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Feb 11 09:06:04 2011 +1000
+
+    xkbcomp 1.2.1
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit ab5371cefe2b7438b74338f71ff890e0e868b3df
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Wed Jan 19 10:06:56 2011 -0500
+
+    config: move man pages into their own directory
+    
+    Use services provided by XORG_MANPAGE_SECTIONS.
+    Use standard Makefile for man pages.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 9ce8e2f42ab7695b5165ff0a3d892df96a3c3f01
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Thu Jan 13 11:15:47 2011 -0500
+
+    man: remove trailing spaces and tabs
+    
+    Using s/[ \t]*$//
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 5ecf21cc130d7a45cb5e82e9c2c3025edee5d74f
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Wed Jan 12 16:28:02 2011 -0500
+
+    config: replace deprecated AM_CONFIG_HEADER with AC_CONFIG_HEADERS
+    
+    This silences an Autoconf warning
+
+commit e27e8c2a15ddcf51b2ea58f8eced7f035aa1301e
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Wed Jan 12 15:29:50 2011 -0500
+
+    config: replace deprecated AC_HELP_STRING with AS_HELP_STRING
+    
+    This silences an Automake warning.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit f524cfae6951442c9a9da65ef317b9c04199500f
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Jan 4 00:05:18 2011 -0800
+
+    Remove out-of-date copies of README.config & README.enhancing
+    
+    The up-to-date master copies of those documents are found in the
+    xorg-docs module, and posted on the X.Org website.
+    
+    Also, x-docs.org no longer carries X11 docs, so point to X.Org's
+    website instead in the README.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+
+commit cc55d8f5ab021861308b071aab9c03016be15187
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Sun Oct 31 20:35:24 2010 -0400
+
+    config: replace AC_CHECK_FILE with test -f as it fails to cross-compile
+    
+    Testing for the presence of xkbparse.c is legitimate as this is a build
+    file, but the Autoconf macro assumes it is testing on the host system
+    and fails.
+    
+    Tested-by: Abdoulaye Walsimou Gaye <awg@embtoolkit.org>
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 1d59f5b0387b18028017cfab4e55b703417dd735
+Author: Dirk Wallenstein <halsmit@t-online.de>
+Date:   Fri Oct 29 13:08:25 2010 +0200
+
+    man: Improve description of device selection option
+    
+    The device selection option takes effect when loading keymaps, too.
+    
+    Signed-off-by: Dirk Wallenstein <halsmit@t-online.de>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 281c7744f682c1ba4f44c0ee22f9bf7188c14fe6
+Author: Dirk Wallenstein <halsmit@t-online.de>
+Date:   Fri Oct 29 11:35:10 2010 +0200
+
+    Allow uploading a keymap to a single device
+    
+    Signed-off-by: Dirk Wallenstein <halsmit@t-online.de>
+    Reviewed-by: Julien Cristau <jcristau@debian.org>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 851a5f6e0c1b2a98d4714d95e40198ab5dc61607
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sat Oct 30 09:59:52 2010 -0700
+
+    xkbcomp 1.2.0
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 87576c9ebf0f28d66833bb28a8199df1aa01f693
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Sep 23 20:29:57 2010 -0700
+
+    config: Remove unnecessary calls from configure.ac
+    
+    AC_PROG_CC & AC_PROG_INSTALL are provided by XORG_DEFAULT_OPTIONS now
+    PKG_CONFIG_MODULES handles AC_SUBST of the CFLAGS & LIBS variables
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit d083293a4e227e9dd27f74cde391fde4c5824b0c
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Sep 23 20:29:14 2010 -0700
+
+    config: upgrade to util-macros 1.8 for additional man page support
+    
+    Use MAN_SUBST now supplied in XORG_MANPAGE_SECTIONS
+    The value of MAN_SUBST is the same for all X.Org packages.
+    
+    Use AC_PROG_SED now supplied by XORG_DEFAULT_OPTIONS
+    The existing statement can now be removed from the configuration file.
+    
+    Use automake provided $(AM_V_GEN) and XORG_DEFAULT_OPTIONS provided $(SED)
+    Enables silent rule and use platform appropriate version of sed.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 8f13f1af68fc55b7567a4eb4462a0c911722a3c4
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Jul 20 18:45:18 2010 -0400
+
+    config: update AC_PREREQ statement to 2.60
+    
+    Unrelated to the previous patches, the new value simply reflects
+    the reality that the minimum level for autoconf to configure
+    all x.org modules is 2.60 dated June 2006.
+    
+    ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.60.tar.gz
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 988eb0e121c0f2c992031002acb7274c2026764b
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Jul 12 10:53:34 2010 +0100
+
+    config: allow to build tarball when yacc is missing
+    
+    Autoconf does not handle this scenario as well as Automake does.
+    If xkbparse.c is already there, do not abort the configuration
+    if yacc is missing as it is not needed.
+    
+    If both xkbparse.c and yacc are missing, abort configuration.
+    Yacc is a required tool to build the package.
+    
+    Reported-by: Julien Cristau <jcristau@debian.org>
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit 446d226f85433aeb45834b65f966397ad6fbb17f
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Mon Jul 12 10:37:49 2010 +0100
+
+    limits.h is mandated by C89, no need to check for it
+    
+    Alan Coopersmith pointed out that C89 mandates limits.h, so for once in
+    X's life, checking for a system header is just being unnecessarily
+    paranoid.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit 61b3d4b024d8146cb0e7659aa958045ceb72c482
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Mon Jul 12 10:28:32 2010 +0100
+
+    Fix signedness issue with getc() return value
+    
+    getc() and ungetc() return and take, respectively, an int rather than a
+    char to allow for error values as well.  Oops.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit a281386fa887e6bf4110840779aed46dd0ac89b6
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jul 9 19:34:29 2010 +0100
+
+    Fix parsing of 0x1a2b3c4d-style symbols
+    
+    Raw keysyms were not getting parsed correctly, due to forgetting to add
+    the code to libX11, forgetting to add the backwards-compat code for old
+    libX11s, and then stuffing the lexing up anyway.  Yeesh.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit 0b04ecbb7a6afb223c91d3b15baab0bc48542281
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Jun 15 19:26:19 2010 +0100
+
+    Fix gcc warnings
+    
+    It was right too: printf was being misused in some spots.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit 41b0857c8c1179b87a26888588cbfff28f8bb0d6
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Jun 8 15:11:19 2010 +0100
+
+    Don't malloc() and free() most scanned symbols
+    
+    Use a constant buffer.  Sigh.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit 7f7a57c75beb5e1dfb53351e490ef00a324b2727
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Jun 8 12:14:00 2010 +0100
+
+    Fix compilation with DEBUG
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit 9887842e33174a6e98675b912e419c711dd20c0f
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Mon Jun 7 22:45:13 2010 +0100
+
+    Use fread() instead of getc()
+    
+    So, it turns out that if you're parsing a fairly large amount of data,
+    using getc() to get all the input rather than, say, read(), is some kind
+    of remarkably daft and unperformant idea.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit 02de53d767b20bab1517b4e8a3e7eb3b9e7f15be
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Mon Jun 7 22:43:01 2010 +0100
+
+    Lazy keysym parsing (avoid XStringToKeysym)
+    
+    Instead of calling XStringToKeysym on every keysym we parse, store it as
+    a string until we need to store it in an actual keymap.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit 07cc4d60dea2b4c947fed45b082edae4a53b186a
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Wed Jun 2 15:23:58 2010 -0400
+
+    config: add check for yacc to insure it is installed #27973
+    
+    Unlike other macros AC_PROG_YACC sets the YACC variable to "yacc"
+    as a last resort, even if no programs have been found. Improve error
+    checking by issuing an error message if yacc is not found. The module
+    cannot build anyway.
+    
+    Reported-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 7888738047e9f1545aa1905b4a2a0654686f49a8
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Thu Feb 11 10:08:07 2010 -0500
+
+    config: move CWARNFLAGS from configure.ac to Makefile.am
+    
+    Compiler warning flags should be explicitly set in the makefile
+    rather than being merged with other packages compiler flags.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit ba906359da32644b40b3a8a71e77d3cabca56efe
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Thu Nov 26 09:19:54 2009 -0500
+
+    Makefile.am: add ChangeLog and INSTALL on MAINTAINERCLEANFILES
+    
+    Now that the INSTALL file is generated.
+    Allows running make maintainer-clean.
+
+commit 667f0a0e5d3143533cbbe5979ef82c13cfa62c3a
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Wed Oct 28 14:09:08 2009 -0400
+
+    INSTALL, NEWS, README or AUTHORS files are missing/incorrect #24206
+    
+    Add missing INSTALL file. Use standard GNU file on building tarball
+    README may have been updated
+    Remove AUTHORS file as it is empty and no content available yet.
+    Remove NEWS file as it is empty and no content available yet.
+
+commit 4b7c8a8ef337614c831b2555afeb6d89dbc14fb1
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Oct 27 15:07:25 2009 -0400
+
+    Deploy the new XORG_DEFAULT_OPTIONS #24242
+    
+    This macro aggregate a number of existing macros that sets commmon
+    X.Org components configuration options. It shields the configuration file from
+    future changes.
+
+commit 5fa9ef7e5e87f875dd92cc33403cebf6c60c557f
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Oct 26 22:08:39 2009 -0400
+
+    Makefile.am: ChangeLog not required: EXTRA_DIST or *CLEANFILES #24432
+    
+    ChangeLog filename is known to Automake and requires no further
+    coding in the makefile.
+
+commit b3a52787e0dad42ea7e8da26926b9533b1ecab84
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Thu Oct 22 12:34:15 2009 -0400
+
+    .gitignore: use common defaults with custom section # 24239
+    
+    Using common defaults will reduce errors and maintenance.
+    Only the very small or inexistent custom section need periodic maintenance
+    when the structure of the component changes. Do not edit defaults.
+
+commit fa7e3ff7b49f76294aa14aa8bf1b8adbceb5d340
+Author: Jeremy Huddleston <jeremyhu@freedesktop.org>
+Date:   Wed Oct 21 12:47:21 2009 -0700
+
+    This is not a GNU project, so declare it foreign.
+    
+    On Wed, 2009-10-21 at 13:36 +1000, Peter Hutterer wrote:
+    > On Tue, Oct 20, 2009 at 08:23:55PM -0700, Jeremy Huddleston wrote:
+    > > I noticed an INSTALL file in xlsclients and libXvMC today, and it
+    > > was quite annoying to work around since 'autoreconf -fvi' replaces
+    > > it and git wants to commit it.  Should these files even be in git?
+    > > Can I nuke them for the betterment of humanity and since they get
+    > > created by autoreconf anyways?
+    >
+    > See https://bugs.freedesktop.org/show_bug.cgi?id=24206
+    
+    As an interim measure, replace AM_INIT_AUTOMAKE([dist-bzip2]) with
+    AM_INIT_AUTOMAKE([foreign dist-bzip2]). This will prevent the generation
+    of the INSTALL file. It is also part of the 24206 solution.
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@freedesktop.org>
+
+commit a5160032d7e46473b8702b87a546071fc0c0978c
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Sat Oct 3 21:12:47 2009 +1000
+
+    xkbcomp 1.1.1
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit a36ca5ba61e2b97398a79713922644fee1a263d1
+Author: Rami Ylimaki <ext-rami.ylimaki@nokia.com>
+Date:   Wed Aug 5 17:16:16 2009 +0300
+
+    xkbcomp: Remove output file if closing fails.
+    
+    Without the fix xkbcomp may leave a truncated file in the filesystem
+    if there is not enough disk space. Using the truncated file leads to
+    problems.
+    
+    Signed-off-by: Rami Ylimaki <ext-rami.ylimaki@nokia.com>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 2cc1dc9a327a5100043d3d54e899b98b81cdf5f5
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Jul 9 08:34:21 2009 +1000
+
+    Bump to 1.1.0.
+
+commit eeaa4aec798ef045d0b3b9de3c25932b85b9ac3d
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon May 11 09:39:03 2009 -0700
+
+    Use temporary buffer for generating Uxxx names to avoid overflow
+    
+    Instead of sprintf()'ing a 4 character string to a char [4] buffer,
+    and leaving the trailing '\0' to overwrite into the next entry,
+    snprintf() to a 5 character temp buffer and memcpy the 4 characters
+    to the right place.
+    
+    Fixes parfait errors:
+    Error: Buffer overflow at xkbcomp-1.0.4/misc.c:393
+            in function 'ComputeKbdDefaults' [Standard C Library pattern matching]
+           In sprintf related dereference of xkb->names->keys[i].name
+            with index not less than '4'
+           Destination array size is 4 bytes, data to be written is 4 bytes
+    Error: Buffer overflow at xkbcomp-1.0.4/misc.c:402
+            in function 'ComputeKbdDefaults' [Standard C Library pattern matching]
+           In sprintf related dereference of xkb->names->keys[i].name
+            with index not less than '4'
+           Destination array size is 4 bytes, data to be written is 4 bytes
+    
+    [This bug was found by the Parfait bug checking tool.
+      For more information see http://research.sun.com/projects/parfait ]
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 2fd42dae8840089727f95211abdb86316e566afd
+Author: Dan Nicholson <dbn.lists@gmail.com>
+Date:   Sat Mar 7 16:36:51 2009 -0800
+
+    Allow the default XKB config root to be set from configure
+    
+    The default was hardcoded in the Makefile as $(datadir)/share/X11/xkb.
+    This could cause a problem if you are installing xkbcomp to an alternate
+    location but want to continue using the system's XKB data.
+    
+    Signed-off-by: Dan Nicholson <dbn.lists@gmail.com>
+
+commit 3b816fe819bd849acdbabcfba769041bd3eab753
+Author: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>
+Date:   Thu Jan 22 02:45:20 2009 -0200
+
+    Correct a remaining of a wrong change to make some DEBUG_VAR's static.
+
+commit f099da35386cf63d4935ba2613409ff28b3d7ea5
+Author: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>
+Date:   Wed Jan 21 20:43:28 2009 -0200
+
+    Correct make distcheck and most gcc and sparse warnings.
+    
+      Remaining warnings are due to macros that check address or vectors
+    on the stack and auto generated yacc code.
+    
+      Compiled with default flags and also as:
+    % make CFLAGS=-DENTRY_TRACKING_ON -DDEBUG_ON -DASSERTIONS_ON
+      to ensure the "simplification" of code like:
+    foo.c:
+    <hash>define DEBUG_VAR foo_VAR
+    <hash>include "foo.h"
+    ...
+    foo.h:
+    <hash>ifdef DEBUG_VAR_NOT_LOCAL
+    extern
+    <hash>endif
+    int DEBUG_VAR;
+    ...
+    did not change the author's "intended" logic.
+
+commit 82cebb165b22d5409c9d4d31554a8da0c867e0d3
+Author: Peter Hutterer <peter.hutterer@redhat.com>
+Date:   Wed Sep 10 17:48:29 2008 +0930
+
+    Check for NULL strings before calling strdup.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@redhat.com>
+
+commit a82e1dcc8ad095581402d05e5d1ae1bbf3646954
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Sep 5 15:07:13 2008 -0700
+
+    sprintf -> snprintf conversions
+
+commit d2d06305e1834548edd8a647564efa222a511b53
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Sep 5 14:44:51 2008 -0700
+
+    Remove #if 0'd typedef that appears nowhere else.
+
+commit acd277d7fd48ccfd8ef2ca052b4e144ee95a5d94
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Sep 5 14:32:15 2008 -0700
+
+    Remove X_NOT_POSIX #ifdefs
+    
+    POSIX.1-1990 is well below the current minimum bar
+
+commit 37b62a26716d3abf2ae07dd88cf54bc04d980bd8
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Sep 5 14:22:33 2008 -0700
+
+    Check for strdup & strcasecmp before assuming we need to provide our own
+
+commit 36fecff588199a3a6c007f09ff709f3148d40f77
+Author: Peter Hutterer <peter.hutterer@redhat.com>
+Date:   Tue Aug 19 16:33:03 2008 +0930
+
+    Don't overwrite previously assigned type indices with useless ones.
+    
+    The default type for a key with no levels is ONE_LEVEL.
+    Let's not overwrite the kt_index with this default type if we have previously
+    assigned a real type.
+    
+    Reproduceable by running setxkbmap -layout "ru(phonetic),us", the first group
+    is assigned ONE_LEVEL and shift stops working.
+    
+    Red Hat Bug #436626 <https://bugzilla.redhat.com/show_bug.cgi?id=436626>
+
+commit d0dfd26e81aef53e9adf5fd6372d69e2ac7a8f9c
+Author: Peter Hutterer <peter.hutterer@redhat.com>
+Date:   Tue Aug 19 14:36:13 2008 +0930
+
+    Remove unused merge parameter from HandleKeyNameVar.
+
+commit 391ea45b2cadc7faeb6acb5d9ec7b405d67d46fd
+Author: Peter Hutterer <peter.hutterer@redhat.com>
+Date:   Tue Aug 19 14:35:39 2008 +0930
+
+    Don't pass useless handlers around in HandleIncludeKeycodes.
+    
+    What use is a handler if we only ever use one function anyway?
+
+commit f05f20fd203afdadbcd571023ed31638ccda1f88
+Author: Peter Hutterer <peter.hutterer@redhat.com>
+Date:   Thu Aug 21 17:28:22 2008 +0930
+
+    More comments.
+
+commit 1aad2a5d8ede9fe5212a4e6087fbe34aa170ac54
+Author: Peter Hutterer <peter.hutterer@redhat.com>
+Date:   Mon Aug 18 16:28:44 2008 +0930
+
+    Remove useless longestPath variable.
+
+commit 7aef93914e1d6446f64aa42eafa18375c2cb4bed
+Author: Peter Hutterer <peter.hutterer@redhat.com>
+Date:   Mon Aug 18 14:05:33 2008 +0930
+
+    Silence valgrind warnings.
+    
+    "Conditional jump or move depends on uninitialised value(s)"
+
+commit eb18e9176841b3ea64c497f1919686e134713eb6
+Author: Peter Hutterer <peter.hutterer@redhat.com>
+Date:   Mon Aug 11 18:01:48 2008 +0930
+
+    Add some explanatory comments
+
+commit 9b877d83947708259252275e14f6995dcf7c29ce
+Author: Peter Hutterer <peter.hutterer@redhat.com>
+Date:   Mon Aug 11 16:20:22 2008 +0930
+
+    If we're not using XkbDesc, don't require it as a parameter.
+
+commit ca32570cf16494fb8e0577de8b05ba18cb927ce1
+Author: Peter Hutterer <peter.hutterer@redhat.com>
+Date:   Mon Aug 11 15:47:09 2008 +0930
+
+    Indent fixes.
+    
+    indent -cbi 0 -nprs -nut -npcs -i4 -bli 0 *.c *.h
+
+commit 12e8f5e5b3f33dbd1290c76dd0d6a4cf832993d7
+Author: Peter Hutterer <peter.hutterer@redhat.com>
+Date:   Mon Aug 11 15:40:03 2008 +0930
+
+    Add a few explanatory comments.
+
+commit de48206e7fe2206542313a2d1d1ea3c40b06114b
+Author: Peter Hutterer <peter.hutterer@redhat.com>
+Date:   Mon Aug 11 15:14:31 2008 +0930
+
+    Remove RCS tags.
+
+commit 8eb2e1fcd08a05f296a31dbadde1ec3cc84d8e28
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Mon May 12 23:25:47 2008 +0200
+
+    Minimal man page addition for new -i option.
+
+commit 12df85eb5b08d5fb815b0965714f120b05c6c670
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri May 9 21:09:44 2008 +0300
+
+    Bump to 1.0.5
+
+commit 1aecdffaa0db7bbf85bc0aae9043e9437b25c30d
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Thu Apr 17 00:52:29 2008 +0300
+
+    Don't scan paths which make NO SENSE WHATSOEVER TO SCAN
+    
+    Hey, I wonder if we have XKB files in our directory! I wonder if we
+    haven't bothered with a structure, and let's try to open a file called
+    'misc' in someone's home directory! What a surprise, it's not a valid
+    XKB file! Let's fail miserably!
+    
+    SURPRISINGLY, THIS IS NOT USEFUL BEHAVIOUR.
+
+commit a3a05fd489a9a35942a4419c537634e796dbebd1
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Thu Apr 17 00:50:07 2008 +0300
+
+    xkbcomp: Take a device ID argument
+    
+    Allows the user to set maps (or whatever) on arbitrary devices.
+
+commit be084fbeba28312fc5102e98d64726464032c3e8
+Author: Adam Jackson <ajax@redhat.com>
+Date:   Thu Mar 6 17:13:42 2008 -0500
+
+    xkbcomp 1.0.4
+
+commit c1cc023fc50ce3a4a23f4682ebefd2301fd13170
+Author: Adam Jackson <ajax@redhat.com>
+Date:   Fri Feb 29 15:30:34 2008 -0500
+
+    Bug #7645: Fix a conditional that always evaluates to FALSE.
+    
+    Since it's if (0 || foo), simplify to if (foo).
+
+commit 3f8bd7e68d0028bce5075124a32cc004166486c6
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Tue Jan 22 16:05:14 2008 -0800
+
+    Bug 14185: MAINTAINERCLEANFILES multiply defined in Makefile.am
+    
+    <http://bugs.freedesktop.org/show_bug.cgi?id=14185>
+
+commit 2421069a3686f7bff702383675fdb77be108021e
+Author: Matthieu Herrb <matthieu@bluenote.herrb.com>
+Date:   Sun Jan 6 11:40:30 2008 +0100
+
+    Revert "Also mark xkbparse.h as a generated file."
+    Apparently only yacc generates it.
+    
+    This reverts commit 3e5b0d615b94c66a2b5a8b3d2e4a04713a442002.
+
+commit 3e5b0d615b94c66a2b5a8b3d2e4a04713a442002
+Author: Matthieu Herrb <matthieu@bluenote.herrb.com>
+Date:   Sun Jan 6 11:17:07 2008 +0100
+
+    Also mark xkbparse.h as a generated file.
+
+commit 686e8b6d33602f5fb7de7a768e532a4ac8090c26
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Thu Dec 6 16:37:18 2007 -0500
+
+    Replace static ChangeLog with dist-hook to generate from git log
+
+commit 6aae208fe5bd8f71757c294a441d7c599a1ec4a1
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Sun Sep 23 20:15:47 2007 +0200
+
+    Ignore *.o and ylwrap.
+
+commit 829cb75130d1edd88fa1d33e277f49167daedacf
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Sun Sep 23 20:15:13 2007 +0200
+
+    Fixed a bunch of const correctness bugs.
+
+commit e8ffa513a109209849b11a3c608356cc28314a8e
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Sun Sep 23 17:50:41 2007 +0200
+
+    Fixed an invalid memory access.
+    
+    Some keynames are less than 3 characters long (not counting the
+    terminator). We're now also initializing all of the keyName array.
+
+commit dfa65b0c8df6a6aab4f86c32a0acb41f44201e7c
+Author: Daniel Drake <ddrake@brontes3d.com>
+Date:   Mon May 21 13:41:00 2007 -0800
+
+    Bug #11025: xkbcomp COPYING file
+    
+    X.Org Bugzilla #11025 <https://bugs.freedesktop.org/show_bug.cgi?id=11025>
+
+commit 3ca028cf767258fd62fb7a1b0eb22d13d333a3ae
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Mon Sep 3 05:51:25 2007 -0400
+
+    Add *~ to .gitignore to skip patch/emacs droppings
+
+commit b00e474ca8dbbb0166f2108e4b08cc3f9c36c735
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Thu Aug 23 19:24:52 2007 -0400
+
+    Rename .cvsignore to .gitignore
+
+commit 313a2748d3dff872e067d515d6deabe1bbd56fbe
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Wed Nov 8 16:30:57 2006 +0200
+
+    bump to 1.0.3
+
+commit 337ed258a1cd3f5a16fa69ef15e98781e76f63a1
+Author: Etsushi Kato <ek.kato@gmail.com>
+Date:   Wed Nov 8 16:29:16 2006 +0200
+
+    compat: avoid use of uninitialised variable (bug #8846)
+    si.interp.match may be unused, so just clobber it, which means we don't
+    end up with stuff like LevelOneOnlyMask wandering in.
+
+commit d920bbadb94684287f70e50ded2a35d65186c188
+Author: Andriy Gapon <avg@icyb.net.ua>
+Date:   Sun Oct 29 02:59:53 2006 +0300
+
+    parser: accept negative numbers in geometry co-ordinates (bug #8763)
+    Accept negative co-ordinates for geometry, per the spec.
+
+commit 0e8fd676de161ba52bb4544f8641be756bc580a1
+Author: Adam Jackson <ajax@nwnk.net>
+Date:   Wed Apr 26 23:41:58 2006 +0000
+
+    Bump to 1.0.2
+
+commit 58c77c8db1bfdc739fac7b100fb813028d0449c7
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Mon Apr 3 11:28:43 2006 +0000
+
+    Bug #4851: Fix up have-no-file test.
+
+commit 02d32f8dbc79116d33ef428d5b064009cdd6a06e
+Author: Kevin E Martin <kem@kem.org>
+Date:   Wed Dec 21 02:29:51 2005 +0000
+
+    Update package version for X11R7 release.
+
+commit 836db774d1f08a050af8717c4c8501f337f36281
+Author: Adam Jackson <ajax@nwnk.net>
+Date:   Mon Dec 19 16:22:44 2005 +0000
+
+    Stub COPYING files
+
+commit e9f680c5654cd93d30b16bc4b626ae5b25f84e87
+Author: Kevin E Martin <kem@kem.org>
+Date:   Thu Dec 15 00:24:08 2005 +0000
+
+    Update package version number for final X11R7 release candidate.
+
+commit b158f550fce661d67604f4a23d33a9f3b7bc22a1
+Author: Kevin E Martin <kem@kem.org>
+Date:   Tue Dec 6 22:48:22 2005 +0000
+
+    Change *man_SOURCES ==> *man_PRE to fix autotools warnings.
+
+commit f1370c50b199c3c8b2760ebf0228d741855390d7
+Author: Kevin E Martin <kem@kem.org>
+Date:   Sat Dec 3 05:49:24 2005 +0000
+
+    Update package version number for X11R7 RC3 release.
+
+commit 8eb3737f5bce19b89c80d9ab256204f0fa62529b
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Mon Nov 28 22:01:43 2005 +0000
+
+    Change *mandir targets to use new *_MAN_DIR variables set by xorg-macros.m4
+        update to fix bug #5167 (Linux prefers *.1x man pages in man1 subdir)
+
+commit f19c3028c34a0dba4ffb9ae19c13421e7ff0ff12
+Author: Eric Anholt <anholt@freebsd.org>
+Date:   Mon Nov 21 10:35:01 2005 +0000
+
+    Another pass at .cvsignores for apps.
+
+commit 3ada747f1cb5400404e4b63430f7a817dbf0c4cb
+Author: Eric Anholt <anholt@freebsd.org>
+Date:   Sun Nov 20 22:08:53 2005 +0000
+
+    Add/improve .cvsignore files for apps.
+
+commit 4eeb611f17bdc01f7a6cb4db3f0997ce5ecc6361
+Author: Kevin E Martin <kem@kem.org>
+Date:   Wed Oct 19 02:47:54 2005 +0000
+
+    Update package version number for RC1 release.
+
+commit 958d09064c96cb50df6f92bfb8d4754c87451920
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Mon Oct 17 23:56:23 2005 +0000
+
+    Use @APP_MAN_SUFFIX@ instead of $(APP_MAN_SUFFIX) in macro substitutions to
+        work better with BSD make
+
+commit 950fba3262905c58891773a8795305e685dc1cb3
+Author: Kevin E Martin <kem@kem.org>
+Date:   Sat Oct 15 19:32:52 2005 +0000
+
+    Have generated files be cleaned by maintainer in order to pass
+        check-tarball test.
+
+commit a83e4bb777d6f9b1b42a7fb3ff84a5e0d7e123c7
+Author: Alan Coopersmith <Alan.Coopersmith@sun.com>
+Date:   Fri Oct 14 00:25:46 2005 +0000
+
+    Use sed to fill in variables in man page
+
+commit 8c0d310c1acccc424dae29554a5075f9b339e95f
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:   Thu Sep 1 19:37:02 2005 +0000
+
+    Define DFLT_XKB_CONFIG_ROOT to $(datadir)/X11/xkb so we look in the right
+        place.
+
+commit fabda6a820bdccae85a7c22ad0b30f089952606b
+Author: Keith Packard <keithp@keithp.com>
+Date:   Tue Aug 2 18:03:01 2005 +0000
+
+    Mark generated files as BUILT_SOURCES and CLEANFILES to ensure they are
+        regenerated after 'make clean' and to make parallel builds work right.
+
+commit 35e0b7ef41ffe1f17ad8f21dbda10267961231ea
+Author: Kevin E Martin <kem@kem.org>
+Date:   Fri Jul 29 21:22:35 2005 +0000
+
+    Various changes preparing packages for RC0:
+    - Verify and update package version numbers as needed
+    - Implement versioning scheme
+    - Change bug address to point to bugzilla bug entry form
+    - Disable loadable i18n in libX11 by default (use --enable-loadable-i18n to
+        reenable it)
+    - Fix makedepend to use pkgconfig and pass distcheck
+    - Update build script to build macros first
+    - Update modular Xorg version
+
+commit e447fee50a8014b5281a5abfcc5e468f8cc130ca
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jul 22 15:08:19 2005 +0000
+
+    Use YACC to compile xkbparse.y.
+
+commit 34cd161f5947b4dc185356bc65653717f56ced00
+Author: Adam Jackson <ajax@nwnk.net>
+Date:   Wed Jul 20 19:31:57 2005 +0000
+
+    Use a unique token for PKG_CHECK_MODULES. Otherwise, if you use a global
+        configure cache, you cache it, and the cached value is probably wrong.
+
+commit 8335e5fa471e25675c6a369ec2348883953fcdd0
+Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk>
+Date:   Sat Jul 16 20:56:47 2005 +0000
+
+    Add xkbcomp data to symlink.sh. Some fixes to xkbcomp/Makefile.am
+
+commit d7b3354575f31caa9044b6c5f7aee4f010f6192a
+Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk>
+Date:   Fri Jul 15 18:02:35 2005 +0000
+
+    Build system for xkbcomp
+
+commit 59e48918e7c252926bb5e51a077bcbc8a7eec829
+Author: Alexander Gottwald <alexander.gottwald@s1999.tu-chemnitz.de>
+Date:   Mon Nov 15 15:06:52 2004 +0000
+
+    Bufzilla #1802, http://freedesktop.org/bugzilla/show_bug.cgi?id=1802 Added
+        mingw (Win32) port
+
+commit 0336e043fab6f2a8828d90bc9eef2e23878f6dd1
+Author: Kevin E Martin <kem@kem.org>
+Date:   Fri Sep 3 23:41:22 2004 +0000
+
+    Update formatted docs.
+
+commit 20240438ef9d3a6c66443ca9f095a2766ef6ed4e
+Author: Egbert Eich <eich@suse.de>
+Date:   Fri Apr 23 19:54:50 2004 +0000
+
+    Merging XORG-CURRENT into trunk
+
+commit a3729a9f9fcda07b233f434266148c8751684347
+Author: Egbert Eich <eich@suse.de>
+Date:   Sun Mar 14 08:35:25 2004 +0000
+
+    Importing vendor version xf86-4_4_99_1 on Sun Mar 14 00:26:39 PST 2004
+
+commit 37a1152a4024fb799fe1272ce378e6c7c97ee951
+Author: Egbert Eich <eich@suse.de>
+Date:   Wed Mar 3 12:13:08 2004 +0000
+
+    Importing vendor version xf86-4_4_0 on Wed Mar 3 04:09:24 PST 2004
+
+commit 55f40d0286d0e2e4b1602f983b749352188c3ec4
+Author: Egbert Eich <eich@suse.de>
+Date:   Thu Feb 26 13:36:25 2004 +0000
+
+    readding XFree86's cvs IDs
+
+commit 2a95cda1d358fc309c78dc5201a1dbacaba9d0bf
+Author: Egbert Eich <eich@suse.de>
+Date:   Thu Feb 26 09:24:08 2004 +0000
+
+    Importing vendor version xf86-4_3_99_903 on Wed Feb 26 01:21:00 PST 2004
+
+commit dbba2cffbc57e5bbdec8f24417a8a5dcfef7c2a2
+Author: Egbert Eich <eich@suse.de>
+Date:   Thu Jan 29 08:09:12 2004 +0000
+
+    Importing vendor version xf86-012804-2330 on Thu Jan 29 00:06:33 PST 2004
+
+commit 8aa5bcfe58d3776746d7b0d627f2fb8744fb0817
+Author: Kaleb Keithley <kaleb@freedesktop.org>
+Date:   Fri Dec 19 20:55:58 2003 +0000
+
+    XFree86 4.3.99.902 (RC 2)
+
+commit 37ebbbe7b11febaf548006a9b73db0eebf79881a
+Author: Kaleb Keithley <kaleb@freedesktop.org>
+Date:   Tue Nov 25 19:29:13 2003 +0000
+
+    XFree86 4.3.99.16 Bring the tree up to date for the Cygwin folks
+
+commit 287ac4c6af61d8f9f95cd3b3219c979e1329a2fe
+Author: Kaleb Keithley <kaleb@freedesktop.org>
+Date:   Fri Nov 14 16:49:22 2003 +0000
+
+    XFree86 4.3.0.1
+
+commit 262961d88faf67f69f4630acb8234a4f2c5a6e80
+Author: Kaleb Keithley <kaleb@freedesktop.org>
+Date:   Fri Nov 14 16:49:22 2003 +0000
+
+    Initial revision
+
+commit 2af3aabf0e7eb1514d39b29a6b58fcd0d4de41d1
+Author: Kaleb Keithley <kaleb@freedesktop.org>
+Date:   Fri Nov 14 15:54:54 2003 +0000
+
+    R6.6 is the Xorg base-line
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..8b82ade
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,291 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
+2006, 2007, 2008 Free Software Foundation, Inc.
+
+   This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+   Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package.  The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.
+
+     Running `configure' might take a while.  While running, it prints
+     some messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+  6. Often, you can also type `make uninstall' to remove the installed
+     files again.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you can use GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory.  After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+   On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor.  Like
+this:
+
+     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CPP="gcc -E" CXXCPP="g++ -E"
+
+   This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
+Installation Names
+==================
+
+   By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc.  You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Particular systems
+==================
+
+   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+     ./configure CC="cc -Ae"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
+a workaround.  If GNU CC is not installed, it is therefore recommended
+to try
+
+     ./configure CC="cc"
+
+and if that doesn't work, try
+
+     ./configure CC="cc -nodtk"
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+   Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf bug.  Until the bug is fixed you can use this workaround:
+
+     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+`configure' Invocation
+======================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+     Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+     Print a summary of the options unique to this package's
+     `configure', and exit.  The `short' variant lists options used
+     only in the top level, while the `recursive' variant lists options
+     also present in any nested packages.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--prefix=DIR'
+     Use DIR as the installation prefix.  *Note Installation Names::
+     for more details, including other options available for fine-tuning
+     the installation locations.
+
+`--no-create'
+`-n'
+     Run the configure checks, but stop before creating any output
+     files.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..01632f1
--- /dev/null
@@ -0,0 +1,76 @@
+# 
+#  Copyright 2005  Red Hat, Inc.
+# 
+#  Permission to use, copy, modify, distribute, and sell this software and its
+#  documentation for any purpose is hereby granted without fee, provided that
+#  the above copyright notice appear in all copies and that both that
+#  copyright notice and this permission notice appear in supporting
+#  documentation, and that the name of Red Hat not be used in
+#  advertising or publicity pertaining to distribution of the software without
+#  specific, written prior permission.  Red Hat makes no
+#  representations about the suitability of this software for any purpose.  It
+#  is provided "as is" without express or implied warranty.
+# 
+#  RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+#  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+#  EVENT SHALL RED HAT 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.
+
+SUBDIRS = man
+bin_PROGRAMS = xkbcomp
+
+AM_CPPFLAGS = -DDFLT_XKB_CONFIG_ROOT='"$(XKBCONFIGROOT)"'
+AM_CFLAGS = $(XKBCOMP_CFLAGS) $(CWARNFLAGS)
+xkbcomp_LDADD = $(XKBCOMP_LIBS)
+
+xkbcomp_SOURCES = \
+        action.c \
+        action.h \
+        alias.c \
+        alias.h \
+        compat.c \
+        compat.h \
+        expr.c \
+        expr.h \
+        geometry.c \
+        indicators.c \
+        indicators.h \
+        keycodes.c \
+        keycodes.h \
+        keymap.c \
+        keytypes.c \
+        listing.c \
+        misc.c \
+        misc.h \
+        parseutils.c \
+        parseutils.h \
+        symbols.c \
+        tokens.h \
+        utils.c \
+        utils.h \
+        vmod.c \
+        vmod.h \
+        xkbcomp.c \
+        xkbcomp.h \
+        xkbparse.y \
+        xkbpath.c \
+        xkbpath.h \
+        xkbscan.c
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = xkbcomp.pc
+
+MAINTAINERCLEANFILES = ChangeLog INSTALL
+
+.PHONY: ChangeLog INSTALL
+
+INSTALL:
+       $(INSTALL_CMD)
+
+ChangeLog:
+       $(CHANGELOG_CMD)
+
+dist-hook: ChangeLog INSTALL
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..b151552
--- /dev/null
@@ -0,0 +1,972 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# 
+#  Copyright 2005  Red Hat, Inc.
+# 
+#  Permission to use, copy, modify, distribute, and sell this software and its
+#  documentation for any purpose is hereby granted without fee, provided that
+#  the above copyright notice appear in all copies and that both that
+#  copyright notice and this permission notice appear in supporting
+#  documentation, and that the name of Red Hat not be used in
+#  advertising or publicity pertaining to distribution of the software without
+#  specific, written prior permission.  Red Hat makes no
+#  representations about the suitability of this software for any purpose.  It
+#  is provided "as is" without express or implied warranty.
+# 
+#  RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+#  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+#  EVENT SHALL RED HAT 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.
+
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = xkbcomp$(EXEEXT)
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+       $(srcdir)/xkbcomp.pc.in $(top_srcdir)/configure COPYING \
+       ChangeLog INSTALL config.guess config.sub depcomp install-sh \
+       missing xkbparse.c ylwrap
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = xkbcomp.pc
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgconfigdir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_xkbcomp_OBJECTS = action.$(OBJEXT) alias.$(OBJEXT) compat.$(OBJEXT) \
+       expr.$(OBJEXT) geometry.$(OBJEXT) indicators.$(OBJEXT) \
+       keycodes.$(OBJEXT) keymap.$(OBJEXT) keytypes.$(OBJEXT) \
+       listing.$(OBJEXT) misc.$(OBJEXT) parseutils.$(OBJEXT) \
+       symbols.$(OBJEXT) utils.$(OBJEXT) vmod.$(OBJEXT) \
+       xkbcomp.$(OBJEXT) xkbparse.$(OBJEXT) xkbpath.$(OBJEXT) \
+       xkbscan.$(OBJEXT)
+xkbcomp_OBJECTS = $(am_xkbcomp_OBJECTS)
+am__DEPENDENCIES_1 =
+xkbcomp_DEPENDENCIES = $(am__DEPENDENCIES_1)
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo "  CC    " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo "  CCLD  " $@;
+@MAINTAINER_MODE_FALSE@am__skipyacc = test -f $@ ||
+YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS)
+AM_V_YACC = $(am__v_YACC_$(V))
+am__v_YACC_ = $(am__v_YACC_$(AM_DEFAULT_VERBOSITY))
+am__v_YACC_0 = @echo "  YACC  " $@;
+YLWRAP = $(top_srcdir)/ylwrap
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo "  GEN   " $@;
+SOURCES = $(xkbcomp_SOURCES)
+DIST_SOURCES = $(xkbcomp_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+       html-recursive info-recursive install-data-recursive \
+       install-dvi-recursive install-exec-recursive \
+       install-html-recursive install-info-recursive \
+       install-pdf-recursive install-ps-recursive install-recursive \
+       installcheck-recursive installdirs-recursive pdf-recursive \
+       ps-recursive uninstall-recursive
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+DATA = $(pkgconfig_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
+  distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+       $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+       distdir dist dist-all distcheck
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d "$(distdir)" \
+    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr "$(distdir)"; }; }
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+ADMIN_MAN_DIR = @ADMIN_MAN_DIR@
+ADMIN_MAN_SUFFIX = @ADMIN_MAN_SUFFIX@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APP_MAN_DIR = @APP_MAN_DIR@
+APP_MAN_SUFFIX = @APP_MAN_SUFFIX@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BASE_CFLAGS = @BASE_CFLAGS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHANGELOG_CMD = @CHANGELOG_CMD@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CWARNFLAGS = @CWARNFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DRIVER_MAN_DIR = @DRIVER_MAN_DIR@
+DRIVER_MAN_SUFFIX = @DRIVER_MAN_SUFFIX@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FILE_MAN_DIR = @FILE_MAN_DIR@
+FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_CMD = @INSTALL_CMD@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_MAN_DIR = @LIB_MAN_DIR@
+LIB_MAN_SUFFIX = @LIB_MAN_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MAN_SUBSTS = @MAN_SUBSTS@
+MISC_MAN_DIR = @MISC_MAN_DIR@
+MISC_MAN_SUFFIX = @MISC_MAN_SUFFIX@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+REQUIRED_MODULES = @REQUIRED_MODULES@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRICT_CFLAGS = @STRICT_CFLAGS@
+STRIP = @STRIP@
+VERSION = @VERSION@
+XKBCOMP_CFLAGS = @XKBCOMP_CFLAGS@
+XKBCOMP_LIBS = @XKBCOMP_LIBS@
+XKBCONFIGROOT = @XKBCONFIGROOT@
+XORG_MAN_PAGE = @XORG_MAN_PAGE@
+YACC = @YACC@
+YACC_INST = @YACC_INST@
+YFLAGS = @YFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = man
+AM_CPPFLAGS = -DDFLT_XKB_CONFIG_ROOT='"$(XKBCONFIGROOT)"'
+AM_CFLAGS = $(XKBCOMP_CFLAGS) $(CWARNFLAGS)
+xkbcomp_LDADD = $(XKBCOMP_LIBS)
+xkbcomp_SOURCES = \
+        action.c \
+        action.h \
+        alias.c \
+        alias.h \
+        compat.c \
+        compat.h \
+        expr.c \
+        expr.h \
+        geometry.c \
+        indicators.c \
+        indicators.h \
+        keycodes.c \
+        keycodes.h \
+        keymap.c \
+        keytypes.c \
+        listing.c \
+        misc.c \
+        misc.h \
+        parseutils.c \
+        parseutils.h \
+        symbols.c \
+        tokens.h \
+        utils.c \
+        utils.h \
+        vmod.c \
+        vmod.h \
+        xkbcomp.c \
+        xkbcomp.h \
+        xkbparse.y \
+        xkbpath.c \
+        xkbpath.h \
+        xkbscan.c
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = xkbcomp.pc
+MAINTAINERCLEANFILES = ChangeLog INSTALL
+all: config.h
+       $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj .y
+am--refresh:
+       @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+             $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           echo ' $(SHELL) ./config.status'; \
+           $(SHELL) ./config.status;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+       @if test ! -f $@; then \
+         rm -f stamp-h1; \
+         $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
+       else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+       @rm -f stamp-h1
+       cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
+       ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+       rm -f stamp-h1
+       touch $@
+
+distclean-hdr:
+       -rm -f config.h stamp-h1
+xkbcomp.pc: $(top_builddir)/config.status $(srcdir)/xkbcomp.pc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+install-binPROGRAMS: $(bin_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+       @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+       for p in $$list; do echo "$$p $$p"; done | \
+       sed 's/$(EXEEXT)$$//' | \
+       while read p p1; do if test -f $$p; \
+         then echo "$$p"; echo "$$p"; else :; fi; \
+       done | \
+       sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+           -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+       sed 'N;N;N;s,\n, ,g' | \
+       $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+         { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+           if ($$2 == $$4) files[d] = files[d] " " $$1; \
+           else { print "f", $$3 "/" $$4, $$1; } } \
+         END { for (d in files) print "f", d, files[d] }' | \
+       while read type dir files; do \
+           if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+           test -z "$$files" || { \
+             echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+             $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+           } \
+       ; done
+
+uninstall-binPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+       files=`for p in $$list; do echo "$$p"; done | \
+         sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+             -e 's/$$/$(EXEEXT)/' `; \
+       test -n "$$list" || exit 0; \
+       echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+       cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+       -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+xkbcomp$(EXEEXT): $(xkbcomp_OBJECTS) $(xkbcomp_DEPENDENCIES) 
+       @rm -f xkbcomp$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(xkbcomp_OBJECTS) $(xkbcomp_LDADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/action.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alias.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expr.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geometry.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/indicators.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keycodes.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keymap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keytypes.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listing.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parseutils.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symbols.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vmod.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xkbcomp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xkbparse.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xkbpath.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xkbscan.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_FALSE@  $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_FALSE@  $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.y.c:
+       $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE)
+install-pkgconfigDATA: $(pkgconfig_DATA)
+       @$(NORMAL_INSTALL)
+       test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)"
+       @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
+         $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
+       done
+
+uninstall-pkgconfigDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       test -n "$$files" || exit 0; \
+       echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \
+       cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+       @fail= failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+       @fail= failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       rev=''; for subdir in $$list; do \
+         if test "$$subdir" = "."; then :; else \
+           rev="$$subdir $$rev"; \
+         fi; \
+       done; \
+       rev="$$rev ."; \
+       target=`echo $@ | sed s/-recursive//`; \
+       for subdir in $$rev; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done && test -z "$$fail"
+tags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+       done
+ctags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+       done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+         include_option=--etags-include; \
+         empty_fix=.; \
+       else \
+         include_option=--include; \
+         empty_fix=; \
+       fi; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test ! -f $$subdir/TAGS || \
+             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       $(am__remove_distdir)
+       test -d "$(distdir)" || mkdir "$(distdir)"
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test -d "$(distdir)/$$subdir" \
+           || $(MKDIR_P) "$(distdir)/$$subdir" \
+           || exit 1; \
+         fi; \
+       done
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+           $(am__relativize); \
+           new_distdir=$$reldir; \
+           dir1=$$subdir; dir2="$(top_distdir)"; \
+           $(am__relativize); \
+           new_top_distdir=$$reldir; \
+           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+           ($(am__cd) $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$$new_top_distdir" \
+               distdir="$$new_distdir" \
+               am__remove_distdir=: \
+               am__skip_length_check=: \
+               am__skip_mode_fix=: \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
+       $(MAKE) $(AM_MAKEFLAGS) \
+         top_distdir="$(top_distdir)" distdir="$(distdir)" \
+         dist-hook
+       -test -n "$(am__skip_mode_fix)" \
+       || find "$(distdir)" -type d ! -perm -755 \
+               -exec chmod u+rwx,go+rx {} \; -o \
+         ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+       || chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       $(am__remove_distdir)
+dist-bzip2: distdir
+       tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+       $(am__remove_distdir)
+
+dist-lzma: distdir
+       tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+       $(am__remove_distdir)
+
+dist-xz: distdir
+       tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
+       $(am__remove_distdir)
+
+dist-tarZ: distdir
+       tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+       $(am__remove_distdir)
+
+dist-shar: distdir
+       shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+       $(am__remove_distdir)
+
+dist-zip: distdir
+       -rm -f $(distdir).zip
+       zip -rq $(distdir).zip $(distdir)
+       $(am__remove_distdir)
+
+dist dist-all: distdir
+       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+       $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+       case '$(DIST_ARCHIVES)' in \
+       *.tar.gz*) \
+         GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+       *.tar.bz2*) \
+         bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+       *.tar.lzma*) \
+         lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
+       *.tar.xz*) \
+         xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+       *.tar.Z*) \
+         uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+       *.shar.gz*) \
+         GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+       *.zip*) \
+         unzip $(distdir).zip ;;\
+       esac
+       chmod -R a-w $(distdir); chmod a+w $(distdir)
+       mkdir $(distdir)/_build
+       mkdir $(distdir)/_inst
+       chmod a-w $(distdir)
+       test -d $(distdir)/_build || exit 0; \
+       dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+         && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+         && am__cwd=`pwd` \
+         && $(am__cd) $(distdir)/_build \
+         && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+           $(DISTCHECK_CONFIGURE_FLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) dvi \
+         && $(MAKE) $(AM_MAKEFLAGS) check \
+         && $(MAKE) $(AM_MAKEFLAGS) install \
+         && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+         && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+         && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+               distuninstallcheck \
+         && chmod -R a-w "$$dc_install_base" \
+         && ({ \
+              (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+                   distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+             } || { rm -rf "$$dc_destdir"; exit 1; }) \
+         && rm -rf "$$dc_destdir" \
+         && $(MAKE) $(AM_MAKEFLAGS) dist \
+         && rm -rf $(DIST_ARCHIVES) \
+         && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+         && cd "$$am__cwd" \
+         || exit 1
+       $(am__remove_distdir)
+       @(echo "$(distdir) archives ready for distribution: "; \
+         list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+         sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+       @$(am__cd) '$(distuninstallcheck_dir)' \
+       && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+          || { echo "ERROR: files left after uninstall:" ; \
+               if test -n "$(DESTDIR)"; then \
+                 echo "  (check DESTDIR support)"; \
+               fi ; \
+               $(distuninstallcheck_listfiles) ; \
+               exit 1; } >&2
+distcleancheck: distclean
+       @if test '$(srcdir)' = . ; then \
+         echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+         exit 1 ; \
+       fi
+       @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+         || { echo "ERROR: files left in build directory after distclean:" ; \
+              $(distcleancheck_listfiles) ; \
+              exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(PROGRAMS) $(DATA) config.h
+installdirs: installdirs-recursive
+installdirs-am:
+       for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgconfigdir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+       -rm -f xkbparse.c
+       -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-hdr distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-pkgconfigDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -rf $(top_srcdir)/autom4te.cache
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-pkgconfigDATA
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
+       ctags-recursive install-am install-strip tags-recursive
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+       all all-am am--refresh check check-am clean clean-binPROGRAMS \
+       clean-generic ctags ctags-recursive dist dist-all dist-bzip2 \
+       dist-gzip dist-hook dist-lzma dist-shar dist-tarZ dist-xz \
+       dist-zip distcheck distclean distclean-compile \
+       distclean-generic distclean-hdr distclean-tags distcleancheck \
+       distdir distuninstallcheck dvi dvi-am html html-am info \
+       info-am install install-am install-binPROGRAMS install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-pkgconfigDATA install-ps install-ps-am install-strip \
+       installcheck installcheck-am installdirs installdirs-am \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+       tags tags-recursive uninstall uninstall-am \
+       uninstall-binPROGRAMS uninstall-pkgconfigDATA
+
+
+.PHONY: ChangeLog INSTALL
+
+INSTALL:
+       $(INSTALL_CMD)
+
+ChangeLog:
+       $(CHANGELOG_CMD)
+
+dist-hook: ChangeLog INSTALL
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..4f79436
--- /dev/null
+++ b/README
@@ -0,0 +1,20 @@
+X Keyboard Extension
+--------------------
+
+The X Keyboard Extension essentially replaces the core protocol definition of
+keyboard. The extension makes possible to clearly and explicitly specify most
+aspects of keyboard behaviour on per-key basis and to more closely track the
+logical and physical state of the keyboard. It also includes a number of
+keyboard controls designed to make keyboards more accessible to people with
+physical impairments.
+
+There are five types of components in the server database corresponing to five
+xkb symbolic names: symbols, geometry, keycodes, compat and types which
+determine the keyboard behaviour. These five components can combined together
+into a resulting keyboard mapping using the 'rules' component.
+
+More information, including the complete specification, can be found on
+http://www.x.org/wiki/XKB
+
+
+
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..464110b
--- /dev/null
@@ -0,0 +1,3027 @@
+# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
+[m4_warning([this file was generated for autoconf 2.68.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11.1], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 10
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 16
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+             [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+                            [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                 [_AM_DEPENDENCIES(CC)],
+                 [define([AC_PROG_CC],
+                         defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                 [_AM_DEPENDENCIES(CXX)],
+                 [define([AC_PROG_CXX],
+                         defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+                 [_AM_DEPENDENCIES(OBJC)],
+                 [define([AC_PROG_OBJC],
+                         defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless `enable' is passed literally.
+# For symmetry, `disable' may be passed as well.  Anyway, the user
+# can override the default with the --enable/--disable switch.
+AC_DEFUN([AM_MAINTAINER_MODE],
+[m4_case(m4_default([$1], [disable]),
+       [enable], [m4_define([am_maintainer_other], [disable])],
+       [disable], [m4_define([am_maintainer_other], [enable])],
+       [m4_define([am_maintainer_other], [enable])
+        m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of Makefiles])
+  dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+  AC_ARG_ENABLE([maintainer-mode],
+[  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
+                         (and sometimes confusing) to the casual installer],
+      [USE_MAINTAINER_MODE=$enableval],
+      [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+  MAINT=$MAINTAINER_MODE_TRUE
+  AC_SUBST([MAINT])dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# Check to see how 'make' treats includes.                 -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \   ]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2009  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# (`yes' being less verbose, `no' or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules],
+[  --enable-silent-rules          less verbose build output (undo: `make V=1')
+  --disable-silent-rules         verbose build output (undo: `make V=0')])
+case $enable_silent_rules in
+yes) AM_DEFAULT_VERBOSITY=0;;
+no)  AM_DEFAULT_VERBOSITY=1;;
+*)   AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
+# 
+# Copyright Â© 2004 Scott James Remnant <scott@netsplit.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# PKG_PROG_PKG_CONFIG([MIN-VERSION])
+# ----------------------------------
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=m4_default([$1], [0.9.0])
+       AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               AC_MSG_RESULT([yes])
+       else
+               AC_MSG_RESULT([no])
+               PKG_CONFIG=""
+       fi
+               
+fi[]dnl
+])# PKG_PROG_PKG_CONFIG
+
+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# Check to see whether a particular set of modules exists.  Similar
+# to PKG_CHECK_MODULES(), but does not set variables or print errors.
+#
+#
+# Similar to PKG_CHECK_MODULES, make sure that the first instance of
+# this or PKG_CHECK_MODULES is called, or make sure to call
+# PKG_CHECK_EXISTS manually
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+  m4_ifval([$2], [$2], [:])
+m4_ifvaln([$3], [else
+  $3])dnl
+fi])
+
+
+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+# ---------------------------------------------
+m4_define([_PKG_CONFIG],
+[if test -n "$$1"; then
+    pkg_cv_[]$1="$$1"
+ elif test -n "$PKG_CONFIG"; then
+    PKG_CHECK_EXISTS([$3],
+                     [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
+                    [pkg_failed=yes])
+ else
+    pkg_failed=untried
+fi[]dnl
+])# _PKG_CONFIG
+
+# _PKG_SHORT_ERRORS_SUPPORTED
+# -----------------------------
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi[]dnl
+])# _PKG_SHORT_ERRORS_SUPPORTED
+
+
+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+# [ACTION-IF-NOT-FOUND])
+#
+#
+# Note that if there is a possibility the first call to
+# PKG_CHECK_MODULES might not happen, you should be sure to include an
+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+#
+#
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+        _PKG_SHORT_ERRORS_SUPPORTED
+        if test $_pkg_short_errors_supported = yes; then
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1`
+        else 
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+       ifelse([$4], , [AC_MSG_ERROR(dnl
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT
+])],
+               [AC_MSG_RESULT([no])
+                $4])
+elif test $pkg_failed = untried; then
+       ifelse([$4], , [AC_MSG_FAILURE(dnl
+[The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])],
+               [$4])
+else
+       $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+       $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+        AC_MSG_RESULT([yes])
+       ifelse([$3], , :, [$3])
+fi[]dnl
+])# PKG_CHECK_MODULES
+
+dnl xorg-macros.m4.  Generated from xorg-macros.m4.in xorgversion.m4 by configure.
+dnl
+dnl Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+dnl 
+dnl Permission is hereby granted, free of charge, to any person obtaining a
+dnl copy of this software and associated documentation files (the "Software"),
+dnl to deal in the Software without restriction, including without limitation
+dnl the rights to use, copy, modify, merge, publish, distribute, sublicense,
+dnl and/or sell copies of the Software, and to permit persons to whom the
+dnl Software is furnished to do so, subject to the following conditions:
+dnl
+dnl The above copyright notice and this permission notice (including the next
+dnl paragraph) shall be included in all copies or substantial portions of the
+dnl Software.
+dnl
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+dnl IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+dnl FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+dnl THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+dnl LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+dnl FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+dnl DEALINGS IN THE SOFTWARE.
+
+# XORG_MACROS_VERSION(required-version)
+# -------------------------------------
+# Minimum version: 1.1.0
+#
+# If you're using a macro added in Version 1.1 or newer, include this in
+# your configure.ac with the minimum required version, such as:
+# XORG_MACROS_VERSION(1.1)
+#
+# To ensure that this macro is defined, also add:
+# m4_ifndef([XORG_MACROS_VERSION],
+#     [m4_fatal([must install xorg-macros 1.1 or later before running autoconf/autogen])])
+#
+#
+# See the "minimum version" comment for each macro you use to see what 
+# version you require.
+m4_defun([XORG_MACROS_VERSION],[
+m4_define([vers_have], [1.17])
+m4_define([maj_have], m4_substr(vers_have, 0, m4_index(vers_have, [.])))
+m4_define([maj_needed], m4_substr([$1], 0, m4_index([$1], [.])))
+m4_if(m4_cmp(maj_have, maj_needed), 0,,
+    [m4_fatal([xorg-macros major version ]maj_needed[ is required but ]vers_have[ found])])
+m4_if(m4_version_compare(vers_have, [$1]), -1,
+    [m4_fatal([xorg-macros version $1 or higher is required but ]vers_have[ found])])
+m4_undefine([vers_have])
+m4_undefine([maj_have])
+m4_undefine([maj_needed])
+]) # XORG_MACROS_VERSION
+
+# XORG_PROG_RAWCPP()
+# ------------------
+# Minimum version: 1.0.0
+#
+# Find cpp program and necessary flags for use in pre-processing text files
+# such as man pages and config files
+AC_DEFUN([XORG_PROG_RAWCPP],[
+AC_REQUIRE([AC_PROG_CPP])
+AC_PATH_PROGS(RAWCPP, [cpp], [${CPP}], 
+   [$PATH:/bin:/usr/bin:/usr/lib:/usr/libexec:/usr/ccs/lib:/usr/ccs/lbin:/lib])
+
+# Check for flag to avoid builtin definitions - assumes unix is predefined,
+# which is not the best choice for supporting other OS'es, but covers most
+# of the ones we need for now.
+AC_MSG_CHECKING([if $RAWCPP requires -undef])
+AC_LANG_CONFTEST([AC_LANG_SOURCE([[Does cpp redefine unix ?]])])
+if test `${RAWCPP} < conftest.$ac_ext | grep -c 'unix'` -eq 1 ; then
+       AC_MSG_RESULT([no])
+else
+       if test `${RAWCPP} -undef < conftest.$ac_ext | grep -c 'unix'` -eq 1 ; then
+               RAWCPPFLAGS=-undef
+               AC_MSG_RESULT([yes])
+       # under Cygwin unix is still defined even with -undef
+       elif test `${RAWCPP} -undef -ansi < conftest.$ac_ext | grep -c 'unix'` -eq 1 ; then
+               RAWCPPFLAGS="-undef -ansi"
+               AC_MSG_RESULT([yes, with -ansi])
+       else
+               AC_MSG_ERROR([${RAWCPP} defines unix with or without -undef.  I don't know what to do.])
+       fi
+fi
+rm -f conftest.$ac_ext
+
+AC_MSG_CHECKING([if $RAWCPP requires -traditional])
+AC_LANG_CONFTEST([AC_LANG_SOURCE([[Does cpp preserve   "whitespace"?]])])
+if test `${RAWCPP} < conftest.$ac_ext | grep -c 'preserve   \"'` -eq 1 ; then
+       AC_MSG_RESULT([no])
+else
+       if test `${RAWCPP} -traditional < conftest.$ac_ext | grep -c 'preserve   \"'` -eq 1 ; then
+               RAWCPPFLAGS="${RAWCPPFLAGS} -traditional"
+               AC_MSG_RESULT([yes])
+       else
+               AC_MSG_ERROR([${RAWCPP} does not preserve whitespace with or without -traditional.  I don't know what to do.])
+       fi
+fi
+rm -f conftest.$ac_ext
+AC_SUBST(RAWCPPFLAGS)
+]) # XORG_PROG_RAWCPP
+
+# XORG_MANPAGE_SECTIONS()
+# -----------------------
+# Minimum version: 1.0.0
+#
+# Determine which sections man pages go in for the different man page types
+# on this OS - replaces *ManSuffix settings in old Imake *.cf per-os files.
+# Not sure if there's any better way than just hardcoding by OS name.
+# Override default settings by setting environment variables
+# Added MAN_SUBSTS in version 1.8
+# Added AC_PROG_SED in version 1.8
+
+AC_DEFUN([XORG_MANPAGE_SECTIONS],[
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_SED])
+
+if test x$APP_MAN_SUFFIX = x    ; then
+    APP_MAN_SUFFIX=1
+fi
+if test x$APP_MAN_DIR = x    ; then
+    APP_MAN_DIR='$(mandir)/man$(APP_MAN_SUFFIX)'
+fi
+
+if test x$LIB_MAN_SUFFIX = x    ; then
+    LIB_MAN_SUFFIX=3
+fi
+if test x$LIB_MAN_DIR = x    ; then
+    LIB_MAN_DIR='$(mandir)/man$(LIB_MAN_SUFFIX)'
+fi
+
+if test x$FILE_MAN_SUFFIX = x    ; then
+    case $host_os in
+       solaris*)       FILE_MAN_SUFFIX=4  ;;
+       *)              FILE_MAN_SUFFIX=5  ;;
+    esac
+fi
+if test x$FILE_MAN_DIR = x    ; then
+    FILE_MAN_DIR='$(mandir)/man$(FILE_MAN_SUFFIX)'
+fi
+
+if test x$MISC_MAN_SUFFIX = x    ; then
+    case $host_os in
+       solaris*)       MISC_MAN_SUFFIX=5  ;;
+       *)              MISC_MAN_SUFFIX=7  ;;
+    esac
+fi
+if test x$MISC_MAN_DIR = x    ; then
+    MISC_MAN_DIR='$(mandir)/man$(MISC_MAN_SUFFIX)'
+fi
+
+if test x$DRIVER_MAN_SUFFIX = x    ; then
+    case $host_os in
+       solaris*)       DRIVER_MAN_SUFFIX=7  ;;
+       *)              DRIVER_MAN_SUFFIX=4  ;;
+    esac
+fi
+if test x$DRIVER_MAN_DIR = x    ; then
+    DRIVER_MAN_DIR='$(mandir)/man$(DRIVER_MAN_SUFFIX)'
+fi
+
+if test x$ADMIN_MAN_SUFFIX = x    ; then
+    case $host_os in
+       solaris*)       ADMIN_MAN_SUFFIX=1m ;;
+       *)              ADMIN_MAN_SUFFIX=8  ;;
+    esac
+fi
+if test x$ADMIN_MAN_DIR = x    ; then
+    ADMIN_MAN_DIR='$(mandir)/man$(ADMIN_MAN_SUFFIX)'
+fi
+
+
+AC_SUBST([APP_MAN_SUFFIX])
+AC_SUBST([LIB_MAN_SUFFIX])
+AC_SUBST([FILE_MAN_SUFFIX])
+AC_SUBST([MISC_MAN_SUFFIX])
+AC_SUBST([DRIVER_MAN_SUFFIX])
+AC_SUBST([ADMIN_MAN_SUFFIX])
+AC_SUBST([APP_MAN_DIR])
+AC_SUBST([LIB_MAN_DIR])
+AC_SUBST([FILE_MAN_DIR])
+AC_SUBST([MISC_MAN_DIR])
+AC_SUBST([DRIVER_MAN_DIR])
+AC_SUBST([ADMIN_MAN_DIR])
+
+XORG_MAN_PAGE="X Version 11"
+AC_SUBST([XORG_MAN_PAGE])
+MAN_SUBSTS="\
+       -e 's|__vendorversion__|\"\$(PACKAGE_STRING)\" \"\$(XORG_MAN_PAGE)\"|' \
+       -e 's|__xorgversion__|\"\$(PACKAGE_STRING)\" \"\$(XORG_MAN_PAGE)\"|' \
+       -e 's|__xservername__|Xorg|g' \
+       -e 's|__xconfigfile__|xorg.conf|g' \
+       -e 's|__projectroot__|\$(prefix)|g' \
+       -e 's|__apploaddir__|\$(appdefaultdir)|g' \
+       -e 's|__appmansuffix__|\$(APP_MAN_SUFFIX)|g' \
+       -e 's|__drivermansuffix__|\$(DRIVER_MAN_SUFFIX)|g' \
+       -e 's|__adminmansuffix__|\$(ADMIN_MAN_SUFFIX)|g' \
+       -e 's|__libmansuffix__|\$(LIB_MAN_SUFFIX)|g' \
+       -e 's|__miscmansuffix__|\$(MISC_MAN_SUFFIX)|g' \
+       -e 's|__filemansuffix__|\$(FILE_MAN_SUFFIX)|g'"
+AC_SUBST([MAN_SUBSTS])
+
+]) # XORG_MANPAGE_SECTIONS
+
+# XORG_CHECK_SGML_DOCTOOLS([MIN-VERSION])
+# ------------------------
+# Minimum version: 1.7.0
+#
+# Defines the variable XORG_SGML_PATH containing the location of X11/defs.ent
+# provided by xorg-sgml-doctools, if installed.
+AC_DEFUN([XORG_CHECK_SGML_DOCTOOLS],[
+AC_MSG_CHECKING([for X.Org SGML entities m4_ifval([$1],[>= $1])])
+XORG_SGML_PATH=
+PKG_CHECK_EXISTS([xorg-sgml-doctools m4_ifval([$1],[>= $1])],
+    [XORG_SGML_PATH=`$PKG_CONFIG --variable=sgmlrootdir xorg-sgml-doctools`],
+    [m4_ifval([$1],[:],
+        [if test x"$cross_compiling" != x"yes" ; then
+            AC_CHECK_FILE([$prefix/share/sgml/X11/defs.ent],
+                          [XORG_SGML_PATH=$prefix/share/sgml])
+         fi])
+    ])
+
+# Define variables STYLESHEET_SRCDIR and XSL_STYLESHEET containing
+# the path and the name of the doc stylesheet
+if test "x$XORG_SGML_PATH" != "x" ; then
+   AC_MSG_RESULT([$XORG_SGML_PATH])
+   STYLESHEET_SRCDIR=$XORG_SGML_PATH/X11
+   XSL_STYLESHEET=$STYLESHEET_SRCDIR/xorg.xsl
+else
+   AC_MSG_RESULT([no])
+fi
+
+AC_SUBST(XORG_SGML_PATH)
+AC_SUBST(STYLESHEET_SRCDIR)
+AC_SUBST(XSL_STYLESHEET)
+AM_CONDITIONAL([HAVE_STYLESHEETS], [test "x$XSL_STYLESHEET" != "x"])
+]) # XORG_CHECK_SGML_DOCTOOLS
+
+# XORG_CHECK_LINUXDOC
+# -------------------
+# Minimum version: 1.0.0
+#
+# Defines the variable MAKE_TEXT if the necessary tools and
+# files are found. $(MAKE_TEXT) blah.sgml will then produce blah.txt.
+# Whether or not the necessary tools and files are found can be checked
+# with the AM_CONDITIONAL "BUILD_LINUXDOC"
+AC_DEFUN([XORG_CHECK_LINUXDOC],[
+AC_REQUIRE([XORG_CHECK_SGML_DOCTOOLS])
+AC_REQUIRE([XORG_WITH_PS2PDF])
+
+AC_PATH_PROG(LINUXDOC, linuxdoc)
+
+AC_MSG_CHECKING([whether to build documentation])
+
+if test x$XORG_SGML_PATH != x && test x$LINUXDOC != x ; then
+   BUILDDOC=yes
+else
+   BUILDDOC=no
+fi
+
+AM_CONDITIONAL(BUILD_LINUXDOC, [test x$BUILDDOC = xyes])
+
+AC_MSG_RESULT([$BUILDDOC])
+
+AC_MSG_CHECKING([whether to build pdf documentation])
+
+if test x$have_ps2pdf != xno && test x$BUILD_PDFDOC != xno; then
+   BUILDPDFDOC=yes
+else
+   BUILDPDFDOC=no
+fi
+
+AM_CONDITIONAL(BUILD_PDFDOC, [test x$BUILDPDFDOC = xyes])
+
+AC_MSG_RESULT([$BUILDPDFDOC])
+
+MAKE_TEXT="SGML_SEARCH_PATH=$XORG_SGML_PATH GROFF_NO_SGR=y $LINUXDOC -B txt -f"
+MAKE_PS="SGML_SEARCH_PATH=$XORG_SGML_PATH $LINUXDOC -B latex --papersize=letter --output=ps"
+MAKE_PDF="$PS2PDF"
+MAKE_HTML="SGML_SEARCH_PATH=$XORG_SGML_PATH $LINUXDOC  -B html --split=0"
+
+AC_SUBST(MAKE_TEXT)
+AC_SUBST(MAKE_PS)
+AC_SUBST(MAKE_PDF)
+AC_SUBST(MAKE_HTML)
+]) # XORG_CHECK_LINUXDOC
+
+# XORG_CHECK_DOCBOOK
+# -------------------
+# Minimum version: 1.0.0
+#
+# Checks for the ability to build output formats from SGML DocBook source.
+# For XXX in {TXT, PDF, PS, HTML}, the AM_CONDITIONAL "BUILD_XXXDOC"
+# indicates whether the necessary tools and files are found and, if set,
+# $(MAKE_XXX) blah.sgml will produce blah.xxx.
+AC_DEFUN([XORG_CHECK_DOCBOOK],[
+AC_REQUIRE([XORG_CHECK_SGML_DOCTOOLS])
+
+BUILDTXTDOC=no
+BUILDPDFDOC=no
+BUILDPSDOC=no
+BUILDHTMLDOC=no
+
+AC_PATH_PROG(DOCBOOKPS, docbook2ps)
+AC_PATH_PROG(DOCBOOKPDF, docbook2pdf)
+AC_PATH_PROG(DOCBOOKHTML, docbook2html)
+AC_PATH_PROG(DOCBOOKTXT, docbook2txt)
+
+AC_MSG_CHECKING([whether to build text documentation])
+if test x$XORG_SGML_PATH != x && test x$DOCBOOKTXT != x &&
+   test x$BUILD_TXTDOC != xno; then
+       BUILDTXTDOC=yes
+fi
+AM_CONDITIONAL(BUILD_TXTDOC, [test x$BUILDTXTDOC = xyes])
+AC_MSG_RESULT([$BUILDTXTDOC])
+
+AC_MSG_CHECKING([whether to build PDF documentation])
+if test x$XORG_SGML_PATH != x && test x$DOCBOOKPDF != x &&
+   test x$BUILD_PDFDOC != xno; then
+       BUILDPDFDOC=yes
+fi
+AM_CONDITIONAL(BUILD_PDFDOC, [test x$BUILDPDFDOC = xyes])
+AC_MSG_RESULT([$BUILDPDFDOC])
+
+AC_MSG_CHECKING([whether to build PostScript documentation])
+if test x$XORG_SGML_PATH != x && test x$DOCBOOKPS != x &&
+   test x$BUILD_PSDOC != xno; then
+       BUILDPSDOC=yes
+fi
+AM_CONDITIONAL(BUILD_PSDOC, [test x$BUILDPSDOC = xyes])
+AC_MSG_RESULT([$BUILDPSDOC])
+
+AC_MSG_CHECKING([whether to build HTML documentation])
+if test x$XORG_SGML_PATH != x && test x$DOCBOOKHTML != x &&
+   test x$BUILD_HTMLDOC != xno; then
+       BUILDHTMLDOC=yes
+fi
+AM_CONDITIONAL(BUILD_HTMLDOC, [test x$BUILDHTMLDOC = xyes])
+AC_MSG_RESULT([$BUILDHTMLDOC])
+
+MAKE_TEXT="SGML_SEARCH_PATH=$XORG_SGML_PATH $DOCBOOKTXT"
+MAKE_PS="SGML_SEARCH_PATH=$XORG_SGML_PATH $DOCBOOKPS"
+MAKE_PDF="SGML_SEARCH_PATH=$XORG_SGML_PATH $DOCBOOKPDF"
+MAKE_HTML="SGML_SEARCH_PATH=$XORG_SGML_PATH $DOCBOOKHTML"
+
+AC_SUBST(MAKE_TEXT)
+AC_SUBST(MAKE_PS)
+AC_SUBST(MAKE_PDF)
+AC_SUBST(MAKE_HTML)
+]) # XORG_CHECK_DOCBOOK
+
+# XORG_WITH_XMLTO([MIN-VERSION], [DEFAULT])
+# ----------------
+# Minimum version: 1.5.0
+# Minimum version for optional DEFAULT argument: 1.11.0
+#
+# Documentation tools are not always available on all platforms and sometimes
+# not at the appropriate level. This macro enables a module to test for the
+# presence of the tool and obtain it's path in separate variables. Coupled with
+# the --with-xmlto option, it allows maximum flexibilty in making decisions
+# as whether or not to use the xmlto package. When DEFAULT is not specified,
+# --with-xmlto assumes 'auto'.
+#
+# Interface to module:
+# HAVE_XMLTO:  used in makefiles to conditionally generate documentation
+# XMLTO:       returns the path of the xmlto program found
+#              returns the path set by the user in the environment
+# --with-xmlto:        'yes' user instructs the module to use xmlto
+#              'no' user instructs the module not to use xmlto
+#
+# Added in version 1.10.0
+# HAVE_XMLTO_TEXT: used in makefiles to conditionally generate text documentation
+#                  xmlto for text output requires either lynx, links, or w3m browsers
+#
+# If the user sets the value of XMLTO, AC_PATH_PROG skips testing the path.
+#
+AC_DEFUN([XORG_WITH_XMLTO],[
+AC_ARG_VAR([XMLTO], [Path to xmlto command])
+m4_define([_defopt], m4_default([$2], [auto]))
+AC_ARG_WITH(xmlto,
+       AS_HELP_STRING([--with-xmlto],
+          [Use xmlto to regenerate documentation (default: ]_defopt[)]),
+          [use_xmlto=$withval], [use_xmlto=]_defopt)
+m4_undefine([_defopt])
+
+if test "x$use_xmlto" = x"auto"; then
+   AC_PATH_PROG([XMLTO], [xmlto])
+   if test "x$XMLTO" = "x"; then
+        AC_MSG_WARN([xmlto not found - documentation targets will be skipped])
+       have_xmlto=no
+   else
+        have_xmlto=yes
+   fi
+elif test "x$use_xmlto" = x"yes" ; then
+   AC_PATH_PROG([XMLTO], [xmlto])
+   if test "x$XMLTO" = "x"; then
+        AC_MSG_ERROR([--with-xmlto=yes specified but xmlto not found in PATH])
+   fi
+   have_xmlto=yes
+elif test "x$use_xmlto" = x"no" ; then
+   if test "x$XMLTO" != "x"; then
+      AC_MSG_WARN([ignoring XMLTO environment variable since --with-xmlto=no was specified])
+   fi
+   have_xmlto=no
+else
+   AC_MSG_ERROR([--with-xmlto expects 'yes' or 'no'])
+fi
+
+# Test for a minimum version of xmlto, if provided.
+m4_ifval([$1],
+[if test "$have_xmlto" = yes; then
+    # scrape the xmlto version
+    AC_MSG_CHECKING([the xmlto version])
+    xmlto_version=`$XMLTO --version 2>/dev/null | cut -d' ' -f3`
+    AC_MSG_RESULT([$xmlto_version])
+    AS_VERSION_COMPARE([$xmlto_version], [$1],
+        [if test "x$use_xmlto" = xauto; then
+            AC_MSG_WARN([xmlto version $xmlto_version found, but $1 needed])
+            have_xmlto=no
+        else
+            AC_MSG_ERROR([xmlto version $xmlto_version found, but $1 needed])
+        fi])
+fi])
+
+# Test for the ability of xmlto to generate a text target
+have_xmlto_text=no
+cat > conftest.xml << "EOF"
+EOF
+AS_IF([test "$have_xmlto" = yes],
+      [AS_IF([$XMLTO --skip-validation txt conftest.xml >/dev/null 2>&1],
+             [have_xmlto_text=yes],
+             [AC_MSG_WARN([xmlto cannot generate text format, this format skipped])])])
+rm -f conftest.xml
+AM_CONDITIONAL([HAVE_XMLTO_TEXT], [test $have_xmlto_text = yes])
+AM_CONDITIONAL([HAVE_XMLTO], [test "$have_xmlto" = yes])
+]) # XORG_WITH_XMLTO
+
+# XORG_WITH_XSLTPROC([MIN-VERSION], [DEFAULT])
+# --------------------------------------------
+# Minimum version: 1.12.0
+# Minimum version for optional DEFAULT argument: 1.12.0
+#
+# XSLT (Extensible Stylesheet Language Transformations) is a declarative,
+# XML-based language used for the transformation of XML documents.
+# The xsltproc command line tool is for applying XSLT stylesheets to XML documents.
+# It is used under the cover by xmlto to generate html files from DocBook/XML.
+# The XSLT processor is often used as a standalone tool for transformations.
+# It should not be assumed that this tool is used only to work with documnetation.
+# When DEFAULT is not specified, --with-xsltproc assumes 'auto'.
+#
+# Interface to module:
+# HAVE_XSLTPROC: used in makefiles to conditionally generate documentation
+# XSLTPROC:     returns the path of the xsltproc program found
+#               returns the path set by the user in the environment
+# --with-xsltproc: 'yes' user instructs the module to use xsltproc
+#                'no' user instructs the module not to use xsltproc
+# have_xsltproc: returns yes if xsltproc found in PATH or no
+#
+# If the user sets the value of XSLTPROC, AC_PATH_PROG skips testing the path.
+#
+AC_DEFUN([XORG_WITH_XSLTPROC],[
+AC_ARG_VAR([XSLTPROC], [Path to xsltproc command])
+# Preserves the interface, should it be implemented later
+m4_ifval([$1], [m4_warn([syntax], [Checking for xsltproc MIN-VERSION is not implemented])])
+m4_define([_defopt], m4_default([$2], [auto]))
+AC_ARG_WITH(xsltproc,
+       AS_HELP_STRING([--with-xsltproc],
+          [Use xsltproc for the transformation of XML documents (default: ]_defopt[)]),
+          [use_xsltproc=$withval], [use_xsltproc=]_defopt)
+m4_undefine([_defopt])
+
+if test "x$use_xsltproc" = x"auto"; then
+   AC_PATH_PROG([XSLTPROC], [xsltproc])
+   if test "x$XSLTPROC" = "x"; then
+        AC_MSG_WARN([xsltproc not found - cannot transform XML documents])
+       have_xsltproc=no
+   else
+        have_xsltproc=yes
+   fi
+elif test "x$use_xsltproc" = x"yes" ; then
+   AC_PATH_PROG([XSLTPROC], [xsltproc])
+   if test "x$XSLTPROC" = "x"; then
+        AC_MSG_ERROR([--with-xsltproc=yes specified but xsltproc not found in PATH])
+   fi
+   have_xsltproc=yes
+elif test "x$use_xsltproc" = x"no" ; then
+   if test "x$XSLTPROC" != "x"; then
+      AC_MSG_WARN([ignoring XSLTPROC environment variable since --with-xsltproc=no was specified])
+   fi
+   have_xsltproc=no
+else
+   AC_MSG_ERROR([--with-xsltproc expects 'yes' or 'no'])
+fi
+
+AM_CONDITIONAL([HAVE_XSLTPROC], [test "$have_xsltproc" = yes])
+]) # XORG_WITH_XSLTPROC
+
+# XORG_WITH_PERL([MIN-VERSION], [DEFAULT])
+# ----------------------------------------
+# Minimum version: 1.15.0
+#
+# PERL (Practical Extraction and Report Language) is a language optimized for
+# scanning arbitrary text files, extracting information from those text files,
+# and printing reports based on that information.
+#
+# When DEFAULT is not specified, --with-perl assumes 'auto'.
+#
+# Interface to module:
+# HAVE_PERL: used in makefiles to conditionally scan text files
+# PERL:             returns the path of the perl program found
+#           returns the path set by the user in the environment
+# --with-perl: 'yes' user instructs the module to use perl
+#             'no' user instructs the module not to use perl
+# have_perl: returns yes if perl found in PATH or no
+#
+# If the user sets the value of PERL, AC_PATH_PROG skips testing the path.
+#
+AC_DEFUN([XORG_WITH_PERL],[
+AC_ARG_VAR([PERL], [Path to perl command])
+# Preserves the interface, should it be implemented later
+m4_ifval([$1], [m4_warn([syntax], [Checking for perl MIN-VERSION is not implemented])])
+m4_define([_defopt], m4_default([$2], [auto]))
+AC_ARG_WITH(perl,
+       AS_HELP_STRING([--with-perl],
+          [Use perl for extracting information from files (default: ]_defopt[)]),
+          [use_perl=$withval], [use_perl=]_defopt)
+m4_undefine([_defopt])
+
+if test "x$use_perl" = x"auto"; then
+   AC_PATH_PROG([PERL], [perl])
+   if test "x$PERL" = "x"; then
+        AC_MSG_WARN([perl not found - cannot extract information and report])
+       have_perl=no
+   else
+        have_perl=yes
+   fi
+elif test "x$use_perl" = x"yes" ; then
+   AC_PATH_PROG([PERL], [perl])
+   if test "x$PERL" = "x"; then
+        AC_MSG_ERROR([--with-perl=yes specified but perl not found in PATH])
+   fi
+   have_perl=yes
+elif test "x$use_perl" = x"no" ; then
+   if test "x$PERL" != "x"; then
+      AC_MSG_WARN([ignoring PERL environment variable since --with-perl=no was specified])
+   fi
+   have_perl=no
+else
+   AC_MSG_ERROR([--with-perl expects 'yes' or 'no'])
+fi
+
+AM_CONDITIONAL([HAVE_PERL], [test "$have_perl" = yes])
+]) # XORG_WITH_PERL
+
+# XORG_WITH_ASCIIDOC([MIN-VERSION], [DEFAULT])
+# ----------------
+# Minimum version: 1.5.0
+# Minimum version for optional DEFAULT argument: 1.11.0
+#
+# Documentation tools are not always available on all platforms and sometimes
+# not at the appropriate level. This macro enables a module to test for the
+# presence of the tool and obtain it's path in separate variables. Coupled with
+# the --with-asciidoc option, it allows maximum flexibilty in making decisions
+# as whether or not to use the asciidoc package. When DEFAULT is not specified,
+# --with-asciidoc assumes 'auto'.
+#
+# Interface to module:
+# HAVE_ASCIIDOC: used in makefiles to conditionally generate documentation
+# ASCIIDOC:     returns the path of the asciidoc program found
+#               returns the path set by the user in the environment
+# --with-asciidoc: 'yes' user instructs the module to use asciidoc
+#                'no' user instructs the module not to use asciidoc
+#
+# If the user sets the value of ASCIIDOC, AC_PATH_PROG skips testing the path.
+#
+AC_DEFUN([XORG_WITH_ASCIIDOC],[
+AC_ARG_VAR([ASCIIDOC], [Path to asciidoc command])
+m4_define([_defopt], m4_default([$2], [auto]))
+AC_ARG_WITH(asciidoc,
+       AS_HELP_STRING([--with-asciidoc],
+          [Use asciidoc to regenerate documentation (default: ]_defopt[)]),
+          [use_asciidoc=$withval], [use_asciidoc=]_defopt)
+m4_undefine([_defopt])
+
+if test "x$use_asciidoc" = x"auto"; then
+   AC_PATH_PROG([ASCIIDOC], [asciidoc])
+   if test "x$ASCIIDOC" = "x"; then
+        AC_MSG_WARN([asciidoc not found - documentation targets will be skipped])
+       have_asciidoc=no
+   else
+        have_asciidoc=yes
+   fi
+elif test "x$use_asciidoc" = x"yes" ; then
+   AC_PATH_PROG([ASCIIDOC], [asciidoc])
+   if test "x$ASCIIDOC" = "x"; then
+        AC_MSG_ERROR([--with-asciidoc=yes specified but asciidoc not found in PATH])
+   fi
+   have_asciidoc=yes
+elif test "x$use_asciidoc" = x"no" ; then
+   if test "x$ASCIIDOC" != "x"; then
+      AC_MSG_WARN([ignoring ASCIIDOC environment variable since --with-asciidoc=no was specified])
+   fi
+   have_asciidoc=no
+else
+   AC_MSG_ERROR([--with-asciidoc expects 'yes' or 'no'])
+fi
+m4_ifval([$1],
+[if test "$have_asciidoc" = yes; then
+    # scrape the asciidoc version
+    AC_MSG_CHECKING([the asciidoc version])
+    asciidoc_version=`$ASCIIDOC --version 2>/dev/null | cut -d' ' -f2`
+    AC_MSG_RESULT([$asciidoc_version])
+    AS_VERSION_COMPARE([$asciidoc_version], [$1],
+        [if test "x$use_asciidoc" = xauto; then
+            AC_MSG_WARN([asciidoc version $asciidoc_version found, but $1 needed])
+            have_asciidoc=no
+        else
+            AC_MSG_ERROR([asciidoc version $asciidoc_version found, but $1 needed])
+        fi])
+fi])
+AM_CONDITIONAL([HAVE_ASCIIDOC], [test "$have_asciidoc" = yes])
+]) # XORG_WITH_ASCIIDOC
+
+# XORG_WITH_DOXYGEN([MIN-VERSION], [DEFAULT])
+# --------------------------------
+# Minimum version: 1.5.0
+# Minimum version for optional DEFAULT argument: 1.11.0
+#
+# Documentation tools are not always available on all platforms and sometimes
+# not at the appropriate level. This macro enables a module to test for the
+# presence of the tool and obtain it's path in separate variables. Coupled with
+# the --with-doxygen option, it allows maximum flexibilty in making decisions
+# as whether or not to use the doxygen package. When DEFAULT is not specified,
+# --with-doxygen assumes 'auto'.
+#
+# Interface to module:
+# HAVE_DOXYGEN: used in makefiles to conditionally generate documentation
+# DOXYGEN:      returns the path of the doxygen program found
+#               returns the path set by the user in the environment
+# --with-doxygen: 'yes' user instructs the module to use doxygen
+#                'no' user instructs the module not to use doxygen
+#
+# If the user sets the value of DOXYGEN, AC_PATH_PROG skips testing the path.
+#
+AC_DEFUN([XORG_WITH_DOXYGEN],[
+AC_ARG_VAR([DOXYGEN], [Path to doxygen command])
+m4_define([_defopt], m4_default([$2], [auto]))
+AC_ARG_WITH(doxygen,
+       AS_HELP_STRING([--with-doxygen],
+          [Use doxygen to regenerate documentation (default: ]_defopt[)]),
+          [use_doxygen=$withval], [use_doxygen=]_defopt)
+m4_undefine([_defopt])
+
+if test "x$use_doxygen" = x"auto"; then
+   AC_PATH_PROG([DOXYGEN], [doxygen])
+   if test "x$DOXYGEN" = "x"; then
+        AC_MSG_WARN([doxygen not found - documentation targets will be skipped])
+       have_doxygen=no
+   else
+        have_doxygen=yes
+   fi
+elif test "x$use_doxygen" = x"yes" ; then
+   AC_PATH_PROG([DOXYGEN], [doxygen])
+   if test "x$DOXYGEN" = "x"; then
+        AC_MSG_ERROR([--with-doxygen=yes specified but doxygen not found in PATH])
+   fi
+   have_doxygen=yes
+elif test "x$use_doxygen" = x"no" ; then
+   if test "x$DOXYGEN" != "x"; then
+      AC_MSG_WARN([ignoring DOXYGEN environment variable since --with-doxygen=no was specified])
+   fi
+   have_doxygen=no
+else
+   AC_MSG_ERROR([--with-doxygen expects 'yes' or 'no'])
+fi
+m4_ifval([$1],
+[if test "$have_doxygen" = yes; then
+    # scrape the doxygen version
+    AC_MSG_CHECKING([the doxygen version])
+    doxygen_version=`$DOXYGEN --version 2>/dev/null`
+    AC_MSG_RESULT([$doxygen_version])
+    AS_VERSION_COMPARE([$doxygen_version], [$1],
+        [if test "x$use_doxygen" = xauto; then
+            AC_MSG_WARN([doxygen version $doxygen_version found, but $1 needed])
+            have_doxygen=no
+        else
+            AC_MSG_ERROR([doxygen version $doxygen_version found, but $1 needed])
+        fi])
+fi])
+AM_CONDITIONAL([HAVE_DOXYGEN], [test "$have_doxygen" = yes])
+]) # XORG_WITH_DOXYGEN
+
+# XORG_WITH_GROFF([DEFAULT])
+# ----------------
+# Minimum version: 1.6.0
+# Minimum version for optional DEFAULT argument: 1.11.0
+#
+# Documentation tools are not always available on all platforms and sometimes
+# not at the appropriate level. This macro enables a module to test for the
+# presence of the tool and obtain it's path in separate variables. Coupled with
+# the --with-groff option, it allows maximum flexibilty in making decisions
+# as whether or not to use the groff package. When DEFAULT is not specified,
+# --with-groff assumes 'auto'.
+#
+# Interface to module:
+# HAVE_GROFF:   used in makefiles to conditionally generate documentation
+# HAVE_GROFF_MM: the memorandum macros (-mm) package
+# HAVE_GROFF_MS: the -ms macros package
+# GROFF:        returns the path of the groff program found
+#               returns the path set by the user in the environment
+# --with-groff:         'yes' user instructs the module to use groff
+#               'no' user instructs the module not to use groff
+#
+# Added in version 1.9.0:
+# HAVE_GROFF_HTML: groff has dependencies to output HTML format:
+#                 pnmcut pnmcrop pnmtopng pnmtops from the netpbm package.
+#                 psselect from the psutils package.
+#                 the ghostcript package. Refer to the grohtml man pages
+#
+# If the user sets the value of GROFF, AC_PATH_PROG skips testing the path.
+#
+# OS and distros often splits groff in a basic and full package, the former
+# having the groff program and the later having devices, fonts and macros
+# Checking for the groff executable is not enough.
+#
+# If macros are missing, we cannot assume that groff is useless, so we don't
+# unset HAVE_GROFF or GROFF env variables.
+# HAVE_GROFF_?? can never be true while HAVE_GROFF is false.
+#
+AC_DEFUN([XORG_WITH_GROFF],[
+AC_ARG_VAR([GROFF], [Path to groff command])
+m4_define([_defopt], m4_default([$1], [auto]))
+AC_ARG_WITH(groff,
+       AS_HELP_STRING([--with-groff],
+          [Use groff to regenerate documentation (default: ]_defopt[)]),
+          [use_groff=$withval], [use_groff=]_defopt)
+m4_undefine([_defopt])
+
+if test "x$use_groff" = x"auto"; then
+   AC_PATH_PROG([GROFF], [groff])
+   if test "x$GROFF" = "x"; then
+        AC_MSG_WARN([groff not found - documentation targets will be skipped])
+       have_groff=no
+   else
+        have_groff=yes
+   fi
+elif test "x$use_groff" = x"yes" ; then
+   AC_PATH_PROG([GROFF], [groff])
+   if test "x$GROFF" = "x"; then
+        AC_MSG_ERROR([--with-groff=yes specified but groff not found in PATH])
+   fi
+   have_groff=yes
+elif test "x$use_groff" = x"no" ; then
+   if test "x$GROFF" != "x"; then
+      AC_MSG_WARN([ignoring GROFF environment variable since --with-groff=no was specified])
+   fi
+   have_groff=no
+else
+   AC_MSG_ERROR([--with-groff expects 'yes' or 'no'])
+fi
+
+# We have groff, test for the presence of the macro packages
+if test "x$have_groff" = x"yes"; then
+    AC_MSG_CHECKING([for ${GROFF} -ms macros])
+    if ${GROFF} -ms -I. /dev/null >/dev/null 2>&1 ; then
+        groff_ms_works=yes
+    else
+        groff_ms_works=no
+    fi
+    AC_MSG_RESULT([$groff_ms_works])
+    AC_MSG_CHECKING([for ${GROFF} -mm macros])
+    if ${GROFF} -mm -I. /dev/null >/dev/null 2>&1 ; then
+        groff_mm_works=yes
+    else
+        groff_mm_works=no
+    fi
+    AC_MSG_RESULT([$groff_mm_works])
+fi
+
+# We have groff, test for HTML dependencies, one command per package
+if test "x$have_groff" = x"yes"; then
+   AC_PATH_PROGS(GS_PATH, [gs gswin32c])
+   AC_PATH_PROG(PNMTOPNG_PATH, [pnmtopng])
+   AC_PATH_PROG(PSSELECT_PATH, [psselect])
+   if test "x$GS_PATH" != "x" -a "x$PNMTOPNG_PATH" != "x" -a "x$PSSELECT_PATH" != "x"; then
+      have_groff_html=yes
+   else
+      have_groff_html=no
+      AC_MSG_WARN([grohtml dependencies not found - HTML Documentation skipped. Refer to grohtml man pages])
+   fi
+fi
+
+# Set Automake conditionals for Makefiles
+AM_CONDITIONAL([HAVE_GROFF], [test "$have_groff" = yes])
+AM_CONDITIONAL([HAVE_GROFF_MS], [test "$groff_ms_works" = yes])
+AM_CONDITIONAL([HAVE_GROFF_MM], [test "$groff_mm_works" = yes])
+AM_CONDITIONAL([HAVE_GROFF_HTML], [test "$have_groff_html" = yes])
+]) # XORG_WITH_GROFF
+
+# XORG_WITH_FOP([MIN-VERSION], [DEFAULT])
+# ---------------------------------------
+# Minimum version: 1.6.0
+# Minimum version for optional DEFAULT argument: 1.11.0
+# Minimum version for optional MIN-VERSION argument: 1.15.0
+#
+# Documentation tools are not always available on all platforms and sometimes
+# not at the appropriate level. This macro enables a module to test for the
+# presence of the tool and obtain it's path in separate variables. Coupled with
+# the --with-fop option, it allows maximum flexibilty in making decisions
+# as whether or not to use the fop package. When DEFAULT is not specified,
+# --with-fop assumes 'auto'.
+#
+# Interface to module:
+# HAVE_FOP:    used in makefiles to conditionally generate documentation
+# FOP:         returns the path of the fop program found
+#              returns the path set by the user in the environment
+# --with-fop:  'yes' user instructs the module to use fop
+#              'no' user instructs the module not to use fop
+#
+# If the user sets the value of FOP, AC_PATH_PROG skips testing the path.
+#
+AC_DEFUN([XORG_WITH_FOP],[
+AC_ARG_VAR([FOP], [Path to fop command])
+m4_define([_defopt], m4_default([$2], [auto]))
+AC_ARG_WITH(fop,
+       AS_HELP_STRING([--with-fop],
+          [Use fop to regenerate documentation (default: ]_defopt[)]),
+          [use_fop=$withval], [use_fop=]_defopt)
+m4_undefine([_defopt])
+
+if test "x$use_fop" = x"auto"; then
+   AC_PATH_PROG([FOP], [fop])
+   if test "x$FOP" = "x"; then
+        AC_MSG_WARN([fop not found - documentation targets will be skipped])
+       have_fop=no
+   else
+        have_fop=yes
+   fi
+elif test "x$use_fop" = x"yes" ; then
+   AC_PATH_PROG([FOP], [fop])
+   if test "x$FOP" = "x"; then
+        AC_MSG_ERROR([--with-fop=yes specified but fop not found in PATH])
+   fi
+   have_fop=yes
+elif test "x$use_fop" = x"no" ; then
+   if test "x$FOP" != "x"; then
+      AC_MSG_WARN([ignoring FOP environment variable since --with-fop=no was specified])
+   fi
+   have_fop=no
+else
+   AC_MSG_ERROR([--with-fop expects 'yes' or 'no'])
+fi
+
+# Test for a minimum version of fop, if provided.
+m4_ifval([$1],
+[if test "$have_fop" = yes; then
+    # scrape the fop version
+    AC_MSG_CHECKING([for fop minimum version])
+    fop_version=`$FOP -version 2>/dev/null | cut -d' ' -f3`
+    AC_MSG_RESULT([$fop_version])
+    AS_VERSION_COMPARE([$fop_version], [$1],
+        [if test "x$use_fop" = xauto; then
+            AC_MSG_WARN([fop version $fop_version found, but $1 needed])
+            have_fop=no
+        else
+            AC_MSG_ERROR([fop version $fop_version found, but $1 needed])
+        fi])
+fi])
+AM_CONDITIONAL([HAVE_FOP], [test "$have_fop" = yes])
+]) # XORG_WITH_FOP
+
+# XORG_WITH_PS2PDF([DEFAULT])
+# ----------------
+# Minimum version: 1.6.0
+# Minimum version for optional DEFAULT argument: 1.11.0
+#
+# Documentation tools are not always available on all platforms and sometimes
+# not at the appropriate level. This macro enables a module to test for the
+# presence of the tool and obtain it's path in separate variables. Coupled with
+# the --with-ps2pdf option, it allows maximum flexibilty in making decisions
+# as whether or not to use the ps2pdf package. When DEFAULT is not specified,
+# --with-ps2pdf assumes 'auto'.
+#
+# Interface to module:
+# HAVE_PS2PDF:         used in makefiles to conditionally generate documentation
+# PS2PDF:      returns the path of the ps2pdf program found
+#              returns the path set by the user in the environment
+# --with-ps2pdf: 'yes' user instructs the module to use ps2pdf
+#               'no' user instructs the module not to use ps2pdf
+#
+# If the user sets the value of PS2PDF, AC_PATH_PROG skips testing the path.
+#
+AC_DEFUN([XORG_WITH_PS2PDF],[
+AC_ARG_VAR([PS2PDF], [Path to ps2pdf command])
+m4_define([_defopt], m4_default([$1], [auto]))
+AC_ARG_WITH(ps2pdf,
+       AS_HELP_STRING([--with-ps2pdf],
+          [Use ps2pdf to regenerate documentation (default: ]_defopt[)]),
+          [use_ps2pdf=$withval], [use_ps2pdf=]_defopt)
+m4_undefine([_defopt])
+
+if test "x$use_ps2pdf" = x"auto"; then
+   AC_PATH_PROG([PS2PDF], [ps2pdf])
+   if test "x$PS2PDF" = "x"; then
+        AC_MSG_WARN([ps2pdf not found - documentation targets will be skipped])
+       have_ps2pdf=no
+   else
+        have_ps2pdf=yes
+   fi
+elif test "x$use_ps2pdf" = x"yes" ; then
+   AC_PATH_PROG([PS2PDF], [ps2pdf])
+   if test "x$PS2PDF" = "x"; then
+        AC_MSG_ERROR([--with-ps2pdf=yes specified but ps2pdf not found in PATH])
+   fi
+   have_ps2pdf=yes
+elif test "x$use_ps2pdf" = x"no" ; then
+   if test "x$PS2PDF" != "x"; then
+      AC_MSG_WARN([ignoring PS2PDF environment variable since --with-ps2pdf=no was specified])
+   fi
+   have_ps2pdf=no
+else
+   AC_MSG_ERROR([--with-ps2pdf expects 'yes' or 'no'])
+fi
+AM_CONDITIONAL([HAVE_PS2PDF], [test "$have_ps2pdf" = yes])
+]) # XORG_WITH_PS2PDF
+
+# XORG_ENABLE_DOCS (enable_docs=yes)
+# ----------------
+# Minimum version: 1.6.0
+#
+# Documentation tools are not always available on all platforms and sometimes
+# not at the appropriate level. This macro enables a builder to skip all
+# documentation targets except traditional man pages.
+# Combined with the specific tool checking macros XORG_WITH_*, it provides
+# maximum flexibilty in controlling documentation building.
+# Refer to:
+# XORG_WITH_XMLTO         --with-xmlto
+# XORG_WITH_ASCIIDOC      --with-asciidoc
+# XORG_WITH_DOXYGEN       --with-doxygen
+# XORG_WITH_FOP           --with-fop
+# XORG_WITH_GROFF         --with-groff
+# XORG_WITH_PS2PDF        --with-ps2pdf
+#
+# Interface to module:
+# ENABLE_DOCS:           used in makefiles to conditionally generate documentation
+# --enable-docs: 'yes' user instructs the module to generate docs
+#               'no' user instructs the module not to generate docs
+# parm1:       specify the default value, yes or no.
+#
+AC_DEFUN([XORG_ENABLE_DOCS],[
+m4_define([docs_default], m4_default([$1], [yes]))
+AC_ARG_ENABLE(docs,
+       AS_HELP_STRING([--enable-docs],
+          [Enable building the documentation (default: ]docs_default[)]),
+          [build_docs=$enableval], [build_docs=]docs_default)
+m4_undefine([docs_default])
+AM_CONDITIONAL(ENABLE_DOCS, [test x$build_docs = xyes])
+AC_MSG_CHECKING([whether to build documentation])
+AC_MSG_RESULT([$build_docs])
+]) # XORG_ENABLE_DOCS
+
+# XORG_ENABLE_DEVEL_DOCS (enable_devel_docs=yes)
+# ----------------
+# Minimum version: 1.6.0
+#
+# This macro enables a builder to skip all developer documentation.
+# Combined with the specific tool checking macros XORG_WITH_*, it provides
+# maximum flexibilty in controlling documentation building.
+# Refer to:
+# XORG_WITH_XMLTO         --with-xmlto
+# XORG_WITH_ASCIIDOC      --with-asciidoc
+# XORG_WITH_DOXYGEN       --with-doxygen
+# XORG_WITH_FOP           --with-fop
+# XORG_WITH_GROFF         --with-groff
+# XORG_WITH_PS2PDF        --with-ps2pdf
+#
+# Interface to module:
+# ENABLE_DEVEL_DOCS:   used in makefiles to conditionally generate developer docs
+# --enable-devel-docs: 'yes' user instructs the module to generate developer docs
+#                      'no' user instructs the module not to generate developer docs
+# parm1:               specify the default value, yes or no.
+#
+AC_DEFUN([XORG_ENABLE_DEVEL_DOCS],[
+m4_define([devel_default], m4_default([$1], [yes]))
+AC_ARG_ENABLE(devel-docs,
+       AS_HELP_STRING([--enable-devel-docs],
+          [Enable building the developer documentation (default: ]devel_default[)]),
+          [build_devel_docs=$enableval], [build_devel_docs=]devel_default)
+m4_undefine([devel_default])
+AM_CONDITIONAL(ENABLE_DEVEL_DOCS, [test x$build_devel_docs = xyes])
+AC_MSG_CHECKING([whether to build developer documentation])
+AC_MSG_RESULT([$build_devel_docs])
+]) # XORG_ENABLE_DEVEL_DOCS
+
+# XORG_ENABLE_SPECS (enable_specs=yes)
+# ----------------
+# Minimum version: 1.6.0
+#
+# This macro enables a builder to skip all functional specification targets.
+# Combined with the specific tool checking macros XORG_WITH_*, it provides
+# maximum flexibilty in controlling documentation building.
+# Refer to:
+# XORG_WITH_XMLTO         --with-xmlto
+# XORG_WITH_ASCIIDOC      --with-asciidoc
+# XORG_WITH_DOXYGEN       --with-doxygen
+# XORG_WITH_FOP           --with-fop
+# XORG_WITH_GROFF         --with-groff
+# XORG_WITH_PS2PDF        --with-ps2pdf
+#
+# Interface to module:
+# ENABLE_SPECS:                used in makefiles to conditionally generate specs
+# --enable-specs:      'yes' user instructs the module to generate specs
+#                      'no' user instructs the module not to generate specs
+# parm1:               specify the default value, yes or no.
+#
+AC_DEFUN([XORG_ENABLE_SPECS],[
+m4_define([spec_default], m4_default([$1], [yes]))
+AC_ARG_ENABLE(specs,
+       AS_HELP_STRING([--enable-specs],
+          [Enable building the specs (default: ]spec_default[)]),
+          [build_specs=$enableval], [build_specs=]spec_default)
+m4_undefine([spec_default])
+AM_CONDITIONAL(ENABLE_SPECS, [test x$build_specs = xyes])
+AC_MSG_CHECKING([whether to build functional specifications])
+AC_MSG_RESULT([$build_specs])
+]) # XORG_ENABLE_SPECS
+
+# XORG_ENABLE_UNIT_TESTS (enable_unit_tests=auto)
+# ----------------------------------------------
+# Minimum version: 1.13.0
+#
+# This macro enables a builder to enable/disable unit testing
+# It makes no assumption about the test cases implementation
+# Test cases may or may not use Automake "Support for test suites"
+# They may or may not use the software utility library GLib
+#
+# When used in conjunction with XORG_WITH_GLIB, use both AM_CONDITIONAL
+# ENABLE_UNIT_TESTS and HAVE_GLIB. Not all unit tests may use glib.
+# The variable enable_unit_tests is used by other macros in this file.
+#
+# Interface to module:
+# ENABLE_UNIT_TESTS:   used in makefiles to conditionally build tests
+# enable_unit_tests:    used in configure.ac for additional configuration
+# --enable-unit-tests: 'yes' user instructs the module to build tests
+#                      'no' user instructs the module not to build tests
+# parm1:               specify the default value, yes or no.
+#
+AC_DEFUN([XORG_ENABLE_UNIT_TESTS],[
+AC_BEFORE([$0], [XORG_WITH_GLIB])
+AC_BEFORE([$0], [XORG_LD_WRAP])
+AC_REQUIRE([XORG_MEMORY_CHECK_FLAGS])
+m4_define([_defopt], m4_default([$1], [auto]))
+AC_ARG_ENABLE(unit-tests, AS_HELP_STRING([--enable-unit-tests],
+       [Enable building unit test cases (default: ]_defopt[)]),
+       [enable_unit_tests=$enableval], [enable_unit_tests=]_defopt)
+m4_undefine([_defopt])
+AM_CONDITIONAL(ENABLE_UNIT_TESTS, [test "x$enable_unit_tests" != xno])
+AC_MSG_CHECKING([whether to build unit test cases])
+AC_MSG_RESULT([$enable_unit_tests])
+]) # XORG_ENABLE_UNIT_TESTS
+
+# XORG_ENABLE_INTEGRATION_TESTS (enable_unit_tests=auto)
+# ------------------------------------------------------
+# Minimum version: 1.17.0
+#
+# This macro enables a builder to enable/disable integration testing
+# It makes no assumption about the test cases' implementation
+# Test cases may or may not use Automake "Support for test suites"
+#
+# Please see XORG_ENABLE_UNIT_TESTS for unit test support. Unit test support
+# usually requires less dependencies and may be built and run under less
+# stringent environments than integration tests.
+#
+# Interface to module:
+# ENABLE_INTEGRATION_TESTS:   used in makefiles to conditionally build tests
+# enable_integration_tests:   used in configure.ac for additional configuration
+# --enable-integration-tests: 'yes' user instructs the module to build tests
+#                             'no' user instructs the module not to build tests
+# parm1:                      specify the default value, yes or no.
+#
+AC_DEFUN([XORG_ENABLE_INTEGRATION_TESTS],[
+AC_REQUIRE([XORG_MEMORY_CHECK_FLAGS])
+m4_define([_defopt], m4_default([$1], [auto]))
+AC_ARG_ENABLE(integration-tests, AS_HELP_STRING([--enable-integration-tests],
+       [Enable building integration test cases (default: ]_defopt[)]),
+       [enable_integration_tests=$enableval],
+       [enable_integration_tests=]_defopt)
+m4_undefine([_defopt])
+AM_CONDITIONAL([ENABLE_INTEGRATION_TESTS],
+       [test "x$enable_integration_tests" != xno])
+AC_MSG_CHECKING([whether to build unit test cases])
+AC_MSG_RESULT([$enable_integration_tests])
+]) # XORG_ENABLE_INTEGRATION_TESTS
+
+# XORG_WITH_GLIB([MIN-VERSION], [DEFAULT])
+# ----------------------------------------
+# Minimum version: 1.13.0
+#
+# GLib is a library which provides advanced data structures and functions.
+# This macro enables a module to test for the presence of Glib.
+#
+# When used with ENABLE_UNIT_TESTS, it is assumed GLib is used for unit testing.
+# Otherwise the value of $enable_unit_tests is blank.
+#
+# Please see XORG_ENABLE_INTEGRATION_TESTS for integration test support. Unit
+# test support usually requires less dependencies and may be built and run under
+# less stringent environments than integration tests.
+#
+# Interface to module:
+# HAVE_GLIB: used in makefiles to conditionally build targets
+# with_glib: used in configure.ac to know if GLib has been found
+# --with-glib: 'yes' user instructs the module to use glib
+#              'no' user instructs the module not to use glib
+#
+AC_DEFUN([XORG_WITH_GLIB],[
+AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+m4_define([_defopt], m4_default([$2], [auto]))
+AC_ARG_WITH(glib, AS_HELP_STRING([--with-glib],
+       [Use GLib library for unit testing (default: ]_defopt[)]),
+       [with_glib=$withval], [with_glib=]_defopt)
+m4_undefine([_defopt])
+
+have_glib=no
+# Do not probe GLib if user explicitly disabled unit testing
+if test "x$enable_unit_tests" != x"no"; then
+  # Do not probe GLib if user explicitly disabled it
+  if test "x$with_glib" != x"no"; then
+    m4_ifval(
+      [$1],
+      [PKG_CHECK_MODULES([GLIB], [glib-2.0 >= $1], [have_glib=yes], [have_glib=no])],
+      [PKG_CHECK_MODULES([GLIB], [glib-2.0], [have_glib=yes], [have_glib=no])]
+    )
+  fi
+fi
+
+# Not having GLib when unit testing has been explicitly requested is an error
+if test "x$enable_unit_tests" = x"yes"; then
+  if test "x$have_glib" = x"no"; then
+    AC_MSG_ERROR([--enable-unit-tests=yes specified but glib-2.0 not found])
+  fi
+fi
+
+# Having unit testing disabled when GLib has been explicitly requested is an error
+if test "x$enable_unit_tests" = x"no"; then
+  if test "x$with_glib" = x"yes"; then
+    AC_MSG_ERROR([--enable-unit-tests=yes specified but glib-2.0 not found])
+  fi
+fi
+
+# Not having GLib when it has been explicitly requested is an error
+if test "x$with_glib" = x"yes"; then
+  if test "x$have_glib" = x"no"; then
+    AC_MSG_ERROR([--with-glib=yes specified but glib-2.0 not found])
+  fi
+fi
+
+AM_CONDITIONAL([HAVE_GLIB], [test "$have_glib" = yes])
+]) # XORG_WITH_GLIB
+
+# XORG_LD_WRAP([required|optional])
+# ---------------------------------
+# Minimum version: 1.13.0
+#
+# Check if linker supports -wrap, passed via compiler flags
+#
+# When used with ENABLE_UNIT_TESTS, it is assumed -wrap is used for unit testing.
+# Otherwise the value of $enable_unit_tests is blank.
+#
+# Argument added in 1.16.0 - default is "required", to match existing behavior
+# of returning an error if enable_unit_tests is yes, and ld -wrap is not
+# available, an argument of "optional" allows use when some unit tests require
+# ld -wrap and others do not.
+#
+AC_DEFUN([XORG_LD_WRAP],[
+XORG_CHECK_LINKER_FLAGS([-Wl,-wrap,exit],[have_ld_wrap=yes],[have_ld_wrap=no],
+    [AC_LANG_PROGRAM([#include <stdlib.h>
+                      void __wrap_exit(int status) { return; }],
+                     [exit(0);])])
+# Not having ld wrap when unit testing has been explicitly requested is an error
+if test "x$enable_unit_tests" = x"yes" -a "x$1" != "xoptional"; then
+  if test "x$have_ld_wrap" = x"no"; then
+    AC_MSG_ERROR([--enable-unit-tests=yes specified but ld -wrap support is not available])
+  fi
+fi
+AM_CONDITIONAL([HAVE_LD_WRAP], [test "$have_ld_wrap" = yes])
+#
+]) # XORG_LD_WRAP
+
+# XORG_CHECK_LINKER_FLAGS
+# -----------------------
+# SYNOPSIS
+#
+#   XORG_CHECK_LINKER_FLAGS(FLAGS, [ACTION-SUCCESS], [ACTION-FAILURE], [PROGRAM-SOURCE])
+#
+# DESCRIPTION
+#
+#   Check whether the given linker FLAGS work with the current language's
+#   linker, or whether they give an error.
+#
+#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
+#   success/failure.
+#
+#   PROGRAM-SOURCE is the program source to link with, if needed
+#
+#   NOTE: Based on AX_CHECK_COMPILER_FLAGS.
+#
+# LICENSE
+#
+#   Copyright (c) 2009 Mike Frysinger <vapier@gentoo.org>
+#   Copyright (c) 2009 Steven G. Johnson <stevenj@alum.mit.edu>
+#   Copyright (c) 2009 Matteo Frigo
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.#
+AC_DEFUN([XORG_CHECK_LINKER_FLAGS],
+[AC_MSG_CHECKING([whether the linker accepts $1])
+dnl Some hackery here since AC_CACHE_VAL can't handle a non-literal varname:
+AS_LITERAL_IF([$1],
+  [AC_CACHE_VAL(AS_TR_SH(xorg_cv_linker_flags_[$1]), [
+      ax_save_FLAGS=$LDFLAGS
+      LDFLAGS="$1"
+      AC_LINK_IFELSE([m4_default([$4],[AC_LANG_PROGRAM()])],
+        AS_TR_SH(xorg_cv_linker_flags_[$1])=yes,
+        AS_TR_SH(xorg_cv_linker_flags_[$1])=no)
+      LDFLAGS=$ax_save_FLAGS])],
+  [ax_save_FLAGS=$LDFLAGS
+   LDFLAGS="$1"
+   AC_LINK_IFELSE([AC_LANG_PROGRAM()],
+     eval AS_TR_SH(xorg_cv_linker_flags_[$1])=yes,
+     eval AS_TR_SH(xorg_cv_linker_flags_[$1])=no)
+   LDFLAGS=$ax_save_FLAGS])
+eval xorg_check_linker_flags=$AS_TR_SH(xorg_cv_linker_flags_[$1])
+AC_MSG_RESULT($xorg_check_linker_flags)
+if test "x$xorg_check_linker_flags" = xyes; then
+       m4_default([$2], :)
+else
+       m4_default([$3], :)
+fi
+]) # XORG_CHECK_LINKER_FLAGS
+
+# XORG_MEMORY_CHECK_FLAGS
+# -----------------------
+# Minimum version: 1.16.0
+#
+# This macro attempts to find appropriate memory checking functionality
+# for various platforms which unit testing code may use to catch various
+# forms of memory allocation and access errors in testing.
+#
+# Interface to module:
+# XORG_MALLOC_DEBUG_ENV - environment variables to set to enable debugging
+#                         Usually added to TESTS_ENVIRONMENT in Makefile.am
+#
+# If the user sets the value of XORG_MALLOC_DEBUG_ENV, it is used verbatim.
+#
+AC_DEFUN([XORG_MEMORY_CHECK_FLAGS],[
+
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_ARG_VAR([XORG_MALLOC_DEBUG_ENV],
+           [Environment variables to enable memory checking in tests])
+
+# Check for different types of support on different platforms
+case $host_os in
+    solaris*)
+        AC_CHECK_LIB([umem], [umem_alloc],
+            [malloc_debug_env='LD_PRELOAD=libumem.so UMEM_DEBUG=default'])
+        ;;
+    *-gnu*) # GNU libc - Value is used as a single byte bit pattern,
+        # both directly and inverted, so should not be 0 or 255.
+        malloc_debug_env='MALLOC_PERTURB_=15'
+        ;;
+    darwin*)
+        malloc_debug_env='MallocPreScribble=1 MallocScribble=1 DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib'
+        ;;
+    *bsd*)
+        malloc_debug_env='MallocPreScribble=1 MallocScribble=1'
+        ;;
+esac
+
+# User supplied flags override default flags
+if test "x$XORG_MALLOC_DEBUG_ENV" != "x"; then
+    malloc_debug_env="$XORG_MALLOC_DEBUG_ENV"
+fi
+
+AC_SUBST([XORG_MALLOC_DEBUG_ENV],[$malloc_debug_env])
+]) # XORG_WITH_LINT
+
+# XORG_CHECK_MALLOC_ZERO
+# ----------------------
+# Minimum version: 1.0.0
+#
+# Defines {MALLOC,XMALLOC,XTMALLOC}_ZERO_CFLAGS appropriately if
+# malloc(0) returns NULL.  Packages should add one of these cflags to
+# their AM_CFLAGS (or other appropriate *_CFLAGS) to use them.
+AC_DEFUN([XORG_CHECK_MALLOC_ZERO],[
+AC_ARG_ENABLE(malloc0returnsnull,
+       AS_HELP_STRING([--enable-malloc0returnsnull],
+                      [malloc(0) returns NULL (default: auto)]),
+       [MALLOC_ZERO_RETURNS_NULL=$enableval],
+       [MALLOC_ZERO_RETURNS_NULL=auto])
+
+AC_MSG_CHECKING([whether malloc(0) returns NULL])
+if test "x$MALLOC_ZERO_RETURNS_NULL" = xauto; then
+       AC_RUN_IFELSE([AC_LANG_PROGRAM([
+#include <stdlib.h>
+],[
+    char *m0, *r0, *c0, *p;
+    m0 = malloc(0);
+    p = malloc(10);
+    r0 = realloc(p,0);
+    c0 = calloc(0,10);
+    exit((m0 == 0 || r0 == 0 || c0 == 0) ? 0 : 1);
+])],
+               [MALLOC_ZERO_RETURNS_NULL=yes],
+               [MALLOC_ZERO_RETURNS_NULL=no],
+               [MALLOC_ZERO_RETURNS_NULL=yes])
+fi
+AC_MSG_RESULT([$MALLOC_ZERO_RETURNS_NULL])
+
+if test "x$MALLOC_ZERO_RETURNS_NULL" = xyes; then
+       MALLOC_ZERO_CFLAGS="-DMALLOC_0_RETURNS_NULL"
+       XMALLOC_ZERO_CFLAGS=$MALLOC_ZERO_CFLAGS
+       XTMALLOC_ZERO_CFLAGS="$MALLOC_ZERO_CFLAGS -DXTMALLOC_BC"
+else
+       MALLOC_ZERO_CFLAGS=""
+       XMALLOC_ZERO_CFLAGS=""
+       XTMALLOC_ZERO_CFLAGS=""
+fi
+
+AC_SUBST([MALLOC_ZERO_CFLAGS])
+AC_SUBST([XMALLOC_ZERO_CFLAGS])
+AC_SUBST([XTMALLOC_ZERO_CFLAGS])
+]) # XORG_CHECK_MALLOC_ZERO
+
+# XORG_WITH_LINT()
+# ----------------
+# Minimum version: 1.1.0
+#
+# This macro enables the use of a tool that flags some suspicious and
+# non-portable constructs (likely to be bugs) in C language source code.
+# It will attempt to locate the tool and use appropriate options.
+# There are various lint type tools on different platforms.
+#
+# Interface to module:
+# LINT:                returns the path to the tool found on the platform
+#              or the value set to LINT on the configure cmd line
+#              also an Automake conditional
+# LINT_FLAGS:  an Automake variable with appropriate flags
+#
+# --with-lint: 'yes' user instructs the module to use lint
+#              'no' user instructs the module not to use lint (default)
+#
+# If the user sets the value of LINT, AC_PATH_PROG skips testing the path.
+# If the user sets the value of LINT_FLAGS, they are used verbatim.
+#
+AC_DEFUN([XORG_WITH_LINT],[
+
+AC_ARG_VAR([LINT], [Path to a lint-style command])
+AC_ARG_VAR([LINT_FLAGS], [Flags for the lint-style command])
+AC_ARG_WITH(lint, [AS_HELP_STRING([--with-lint],
+               [Use a lint-style source code checker (default: disabled)])],
+               [use_lint=$withval], [use_lint=no])
+
+# Obtain platform specific info like program name and options
+# The lint program on FreeBSD and NetBSD is different from the one on Solaris
+case $host_os in
+  *linux* | *openbsd* | kfreebsd*-gnu | darwin* | cygwin*)
+       lint_name=splint
+       lint_options="-badflag"
+       ;;
+  *freebsd* | *netbsd*)
+       lint_name=lint
+       lint_options="-u -b"
+       ;;
+  *solaris*)
+       lint_name=lint
+       lint_options="-u -b -h -erroff=E_INDISTING_FROM_TRUNC2"
+       ;;
+esac
+
+# Test for the presence of the program (either guessed by the code or spelled out by the user)
+if test "x$use_lint" = x"yes" ; then
+   AC_PATH_PROG([LINT], [$lint_name])
+   if test "x$LINT" = "x"; then
+        AC_MSG_ERROR([--with-lint=yes specified but lint-style tool not found in PATH])
+   fi
+elif test "x$use_lint" = x"no" ; then
+   if test "x$LINT" != "x"; then
+      AC_MSG_WARN([ignoring LINT environment variable since --with-lint=no was specified])
+   fi
+else
+   AC_MSG_ERROR([--with-lint expects 'yes' or 'no'. Use LINT variable to specify path.])
+fi
+
+# User supplied flags override default flags
+if test "x$LINT_FLAGS" != "x"; then
+   lint_options=$LINT_FLAGS
+fi
+
+AC_SUBST([LINT_FLAGS],[$lint_options])
+AM_CONDITIONAL(LINT, [test "x$LINT" != x])
+
+]) # XORG_WITH_LINT
+
+# XORG_LINT_LIBRARY(LIBNAME)
+# --------------------------
+# Minimum version: 1.1.0
+#
+# Sets up flags for building lint libraries for checking programs that call
+# functions in the library.
+#
+# Interface to module:
+# LINTLIB              - Automake variable with the name of lint library file to make
+# MAKE_LINT_LIB                - Automake conditional
+#
+# --enable-lint-library:  - 'yes' user instructs the module to created a lint library
+#                        - 'no' user instructs the module not to create a lint library (default)
+
+AC_DEFUN([XORG_LINT_LIBRARY],[
+AC_REQUIRE([XORG_WITH_LINT])
+AC_ARG_ENABLE(lint-library, [AS_HELP_STRING([--enable-lint-library],
+       [Create lint library (default: disabled)])],
+       [make_lint_lib=$enableval], [make_lint_lib=no])
+
+if test "x$make_lint_lib" = x"yes" ; then
+   LINTLIB=llib-l$1.ln
+   if test "x$LINT" = "x"; then
+        AC_MSG_ERROR([Cannot make lint library without --with-lint])
+   fi
+elif test "x$make_lint_lib" != x"no" ; then
+   AC_MSG_ERROR([--enable-lint-library expects 'yes' or 'no'.])
+fi
+
+AC_SUBST(LINTLIB)
+AM_CONDITIONAL(MAKE_LINT_LIB, [test x$make_lint_lib != xno])
+
+]) # XORG_LINT_LIBRARY
+
+# XORG_COMPILER_BRAND
+# -------------------
+# Minimum version: 1.14.0
+#
+# Checks for various brands of compilers and sets flags as appropriate:
+#   GNU gcc - relies on AC_PROG_CC (via AC_PROG_CC_C99) to set GCC to "yes"
+#   GNU g++ - relies on AC_PROG_CXX to set GXX to "yes"
+#   clang compiler - sets CLANGCC to "yes"
+#   Intel compiler - sets INTELCC to "yes"
+#   Sun/Oracle Solaris Studio cc - sets SUNCC to "yes"
+#
+AC_DEFUN([XORG_COMPILER_BRAND], [
+AC_LANG_CASE(
+       [C], [
+               AC_REQUIRE([AC_PROG_CC_C99])
+       ],
+       [C++], [
+               AC_REQUIRE([AC_PROG_CXX])
+       ]
+)
+AC_CHECK_DECL([__clang__], [CLANGCC="yes"], [CLANGCC="no"])
+AC_CHECK_DECL([__INTEL_COMPILER], [INTELCC="yes"], [INTELCC="no"])
+AC_CHECK_DECL([__SUNPRO_C], [SUNCC="yes"], [SUNCC="no"])
+]) # XORG_COMPILER_BRAND
+
+# XORG_TESTSET_CFLAG(<variable>, <flag>, [<alternative flag>, ...])
+# ---------------
+# Minimum version: 1.16.0
+#
+# Test if the compiler works when passed the given flag as a command line argument.
+# If it succeeds, the flag is appeneded to the given variable.  If not, it tries the
+# next flag in the list until there are no more options.
+#
+# Note that this does not guarantee that the compiler supports the flag as some
+# compilers will simply ignore arguments that they do not understand, but we do
+# attempt to weed out false positives by using -Werror=unknown-warning-option and
+# -Werror=unused-command-line-argument
+#
+AC_DEFUN([XORG_TESTSET_CFLAG], [
+m4_if([$#], 0, [m4_fatal([XORG_TESTSET_CFLAG was given with an unsupported number of arguments])])
+m4_if([$#], 1, [m4_fatal([XORG_TESTSET_CFLAG was given with an unsupported number of arguments])])
+
+AC_LANG_COMPILER_REQUIRE
+
+AC_LANG_CASE(
+       [C], [
+               AC_REQUIRE([AC_PROG_CC_C99])
+               define([PREFIX], [C])
+               define([CACHE_PREFIX], [cc])
+               define([COMPILER], [$CC])
+       ],
+       [C++], [
+               define([PREFIX], [CXX])
+               define([CACHE_PREFIX], [cxx])
+               define([COMPILER], [$CXX])
+       ]
+)
+
+[xorg_testset_save_]PREFIX[FLAGS]="$PREFIX[FLAGS]"
+
+if test "x$[xorg_testset_]CACHE_PREFIX[_unknown_warning_option]" = "x" ; then
+       PREFIX[FLAGS]="$PREFIX[FLAGS] -Werror=unknown-warning-option"
+       AC_CACHE_CHECK([if ]COMPILER[ supports -Werror=unknown-warning-option],
+                       [xorg_cv_]CACHE_PREFIX[_flag_unknown_warning_option],
+                       AC_COMPILE_IFELSE([AC_LANG_SOURCE([int i;])],
+                                         [xorg_cv_]CACHE_PREFIX[_flag_unknown_warning_option=yes],
+                                         [xorg_cv_]CACHE_PREFIX[_flag_unknown_warning_option=no]))
+       [xorg_testset_]CACHE_PREFIX[_unknown_warning_option]=$[xorg_cv_]CACHE_PREFIX[_flag_unknown_warning_option]
+       PREFIX[FLAGS]="$[xorg_testset_save_]PREFIX[FLAGS]"
+fi
+
+if test "x$[xorg_testset_]CACHE_PREFIX[_unused_command_line_argument]" = "x" ; then
+       if test "x$[xorg_testset_]CACHE_PREFIX[_unknown_warning_option]" = "xyes" ; then
+               PREFIX[FLAGS]="$PREFIX[FLAGS] -Werror=unknown-warning-option"
+       fi
+       PREFIX[FLAGS]="$PREFIX[FLAGS] -Werror=unused-command-line-argument"
+       AC_CACHE_CHECK([if ]COMPILER[ supports -Werror=unused-command-line-argument],
+                       [xorg_cv_]CACHE_PREFIX[_flag_unused_command_line_argument],
+                       AC_COMPILE_IFELSE([AC_LANG_SOURCE([int i;])],
+                                         [xorg_cv_]CACHE_PREFIX[_flag_unused_command_line_argument=yes],
+                                         [xorg_cv_]CACHE_PREFIX[_flag_unused_command_line_argument=no]))
+       [xorg_testset_]CACHE_PREFIX[_unused_command_line_argument]=$[xorg_cv_]CACHE_PREFIX[_flag_unused_command_line_argument]
+       PREFIX[FLAGS]="$[xorg_testset_save_]PREFIX[FLAGS]"
+fi
+
+found="no"
+m4_foreach([flag], m4_cdr($@), [
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       PREFIX[FLAGS]="$PREFIX[FLAGS] -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       PREFIX[FLAGS]="$PREFIX[FLAGS] -Werror=unused-command-line-argument"
+               fi
+
+               PREFIX[FLAGS]="$PREFIX[FLAGS] ]flag["
+
+dnl Some hackery here since AC_CACHE_VAL can't handle a non-literal varname
+               AC_MSG_CHECKING([if ]COMPILER[ supports]flag[])
+               cacheid=AS_TR_SH([xorg_cv_]CACHE_PREFIX[_flag_]flag[])
+               AC_CACHE_VAL($cacheid,
+                            [AC_LINK_IFELSE([AC_LANG_PROGRAM([int i;])],
+                                            [eval $cacheid=yes],
+                                            [eval $cacheid=no])])
+
+               PREFIX[FLAGS]="$[xorg_testset_save_]PREFIX[FLAGS]"
+
+               eval supported=\$$cacheid
+               AC_MSG_RESULT([$supported])
+               if test "$supported" = "yes" ; then
+                       $1="$$1 ]flag["
+                       found="yes"
+               fi
+       fi
+])
+]) # XORG_TESTSET_CFLAG
+
+# XORG_COMPILER_FLAGS
+# ---------------
+# Minimum version: 1.16.0
+#
+# Defines BASE_CFLAGS or BASE_CXXFLAGS to contain a set of command line
+# arguments supported by the selected compiler which do NOT alter the generated
+# code.  These arguments will cause the compiler to print various warnings
+# during compilation AND turn a conservative set of warnings into errors.
+#
+# The set of flags supported by BASE_CFLAGS and BASE_CXXFLAGS will grow in
+# future versions of util-macros as options are added to new compilers.
+#
+AC_DEFUN([XORG_COMPILER_FLAGS], [
+AC_REQUIRE([XORG_COMPILER_BRAND])
+
+AC_ARG_ENABLE(selective-werror,
+              AS_HELP_STRING([--disable-selective-werror],
+                             [Turn off selective compiler errors. (default: enabled)]),
+              [SELECTIVE_WERROR=$enableval],
+              [SELECTIVE_WERROR=yes])
+
+AC_LANG_CASE(
+        [C], [
+                define([PREFIX], [C])
+        ],
+        [C++], [
+                define([PREFIX], [CXX])
+        ]
+)
+# -v is too short to test reliably with XORG_TESTSET_CFLAG
+if test "x$SUNCC" = "xyes"; then
+    [BASE_]PREFIX[FLAGS]="-v"
+else
+    [BASE_]PREFIX[FLAGS]=""
+fi
+
+# This chunk of warnings were those that existed in the legacy CWARNFLAGS
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wall])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wpointer-arith])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wmissing-declarations])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wformat=2], [-Wformat])
+
+AC_LANG_CASE(
+       [C], [
+               XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wstrict-prototypes])
+               XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wmissing-prototypes])
+               XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wnested-externs])
+               XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wbad-function-cast])
+               XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wold-style-definition])
+               XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wdeclaration-after-statement])
+       ]
+)
+
+# This chunk adds additional warnings that could catch undesired effects.
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wunused])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wuninitialized])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wshadow])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wcast-qual])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wmissing-noreturn])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wmissing-format-attribute])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wredundant-decls])
+
+# These are currently disabled because they are noisy.  They will be enabled
+# in the future once the codebase is sufficiently modernized to silence
+# them.  For now, I don't want them to drown out the other warnings.
+# XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wlogical-op])
+# XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wparentheses])
+# XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wcast-align])
+
+# Turn some warnings into errors, so we don't accidently get successful builds
+# when there are problems that should be fixed.
+
+if test "x$SELECTIVE_WERROR" = "xyes" ; then
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Werror=implicit], [-errwarn=E_NO_EXPLICIT_TYPE_GIVEN -errwarn=E_NO_IMPLICIT_DECL_ALLOWED])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Werror=nonnull])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Werror=init-self])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Werror=main])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Werror=missing-braces])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Werror=sequence-point])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Werror=return-type], [-errwarn=E_FUNC_HAS_NO_RETURN_STMT])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Werror=trigraphs])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Werror=array-bounds])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Werror=write-strings])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Werror=address])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Werror=int-to-pointer-cast], [-errwarn=E_BAD_PTR_INT_COMBINATION])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Werror=pointer-to-int-cast]) # Also -errwarn=E_BAD_PTR_INT_COMBINATION
+else
+AC_MSG_WARN([You have chosen not to turn some select compiler warnings into errors.  This should not be necessary.  Please report why you needed to do so in a bug report at $PACKAGE_BUGREPORT])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wimplicit])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wnonnull])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Winit-self])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wmain])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wmissing-braces])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wsequence-point])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wreturn-type])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wtrigraphs])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Warray-bounds])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wwrite-strings])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Waddress])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wint-to-pointer-cast])
+XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wpointer-to-int-cast])
+fi
+
+AC_SUBST([BASE_]PREFIX[FLAGS])
+]) # XORG_COMPILER_FLAGS
+
+# XORG_CWARNFLAGS
+# ---------------
+# Minimum version: 1.2.0
+# Deprecated since: 1.16.0 (Use XORG_COMPILER_FLAGS instead)
+#
+# Defines CWARNFLAGS to enable C compiler warnings.
+#
+# This function is deprecated because it defines -fno-strict-aliasing
+# which alters the code generated by the compiler.  If -fno-strict-aliasing
+# is needed, then it should be added explicitly in the module when
+# it is updated to use BASE_CFLAGS.
+#
+AC_DEFUN([XORG_CWARNFLAGS], [
+AC_REQUIRE([XORG_COMPILER_FLAGS])
+AC_REQUIRE([XORG_COMPILER_BRAND])
+AC_LANG_CASE(
+       [C], [
+               CWARNFLAGS="$BASE_CFLAGS"
+               if  test "x$GCC" = xyes ; then
+                   CWARNFLAGS="$CWARNFLAGS -fno-strict-aliasing"
+               fi
+               AC_SUBST(CWARNFLAGS)
+       ]
+)
+]) # XORG_CWARNFLAGS
+
+# XORG_STRICT_OPTION
+# -----------------------
+# Minimum version: 1.3.0
+#
+# Add configure option to enable strict compilation flags, such as treating
+# warnings as fatal errors.
+# If --enable-strict-compilation is passed to configure, adds strict flags to
+# $BASE_CFLAGS or $BASE_CXXFLAGS and the deprecated $CWARNFLAGS.
+#
+# Starting in 1.14.0 also exports $STRICT_CFLAGS for use in other tests or
+# when strict compilation is unconditionally desired.
+AC_DEFUN([XORG_STRICT_OPTION], [
+AC_REQUIRE([XORG_CWARNFLAGS])
+AC_REQUIRE([XORG_COMPILER_FLAGS])
+
+AC_ARG_ENABLE(strict-compilation,
+                         AS_HELP_STRING([--enable-strict-compilation],
+                         [Enable all warnings from compiler and make them errors (default: disabled)]),
+                         [STRICT_COMPILE=$enableval], [STRICT_COMPILE=no])
+
+AC_LANG_CASE(
+        [C], [
+                define([PREFIX], [C])
+        ],
+        [C++], [
+                define([PREFIX], [CXX])
+        ]
+)
+
+[STRICT_]PREFIX[FLAGS]=""
+XORG_TESTSET_CFLAG([[STRICT_]PREFIX[FLAGS]], [-pedantic])
+XORG_TESTSET_CFLAG([[STRICT_]PREFIX[FLAGS]], [-Werror], [-errwarn])
+
+# Earlier versions of gcc (eg: 4.2) support -Werror=attributes, but do not
+# activate it with -Werror, so we add it here explicitly.
+XORG_TESTSET_CFLAG([[STRICT_]PREFIX[FLAGS]], [-Werror=attributes])
+
+if test "x$STRICT_COMPILE" = "xyes"; then
+    [BASE_]PREFIX[FLAGS]="$[BASE_]PREFIX[FLAGS] $[STRICT_]PREFIX[FLAGS]"
+    AC_LANG_CASE([C], [CWARNFLAGS="$CWARNFLAGS $STRICT_CFLAGS"])
+fi
+AC_SUBST([STRICT_]PREFIX[FLAGS])
+AC_SUBST([BASE_]PREFIX[FLAGS])
+AC_LANG_CASE([C], AC_SUBST([CWARNFLAGS]))
+]) # XORG_STRICT_OPTION
+
+# XORG_DEFAULT_OPTIONS
+# --------------------
+# Minimum version: 1.3.0
+#
+# Defines default options for X.Org modules.
+#
+AC_DEFUN([XORG_DEFAULT_OPTIONS], [
+AC_REQUIRE([AC_PROG_INSTALL])
+XORG_COMPILER_FLAGS
+XORG_CWARNFLAGS
+XORG_STRICT_OPTION
+XORG_RELEASE_VERSION
+XORG_CHANGELOG
+XORG_INSTALL
+XORG_MANPAGE_SECTIONS
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])],
+    [AC_SUBST([AM_DEFAULT_VERBOSITY], [1])])
+]) # XORG_DEFAULT_OPTIONS
+
+# XORG_INSTALL()
+# ----------------
+# Minimum version: 1.4.0
+#
+# Defines the variable INSTALL_CMD as the command to copy
+# INSTALL from $prefix/share/util-macros.
+#
+AC_DEFUN([XORG_INSTALL], [
+AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+macros_datadir=`$PKG_CONFIG --print-errors --variable=pkgdatadir xorg-macros`
+INSTALL_CMD="(cp -f "$macros_datadir/INSTALL" \$(top_srcdir)/.INSTALL.tmp && \
+mv \$(top_srcdir)/.INSTALL.tmp \$(top_srcdir)/INSTALL) \
+|| (rm -f \$(top_srcdir)/.INSTALL.tmp; touch \$(top_srcdir)/INSTALL; \
+echo 'util-macros \"pkgdatadir\" from xorg-macros.pc not found: installing possibly empty INSTALL.' >&2)"
+AC_SUBST([INSTALL_CMD])
+]) # XORG_INSTALL
+dnl Copyright 2005 Red Hat, Inc
+dnl
+dnl Permission to use, copy, modify, distribute, and sell this software and its
+dnl documentation for any purpose is hereby granted without fee, provided that
+dnl the above copyright notice appear in all copies and that both that
+dnl copyright notice and this permission notice appear in supporting
+dnl documentation.
+dnl
+dnl The above copyright notice and this permission notice shall be included
+dnl in all copies or substantial portions of the Software.
+dnl
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+dnl IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+dnl OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+dnl ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+dnl OTHER DEALINGS IN THE SOFTWARE.
+dnl
+dnl Except as contained in this notice, the name of the copyright holders shall
+dnl not be used in advertising or otherwise to promote the sale, use or
+dnl other dealings in this Software without prior written authorization
+dnl from the copyright holders.
+dnl
+
+# XORG_RELEASE_VERSION
+# --------------------
+# Defines PACKAGE_VERSION_{MAJOR,MINOR,PATCHLEVEL} for modules to use.
+AC_DEFUN([XORG_RELEASE_VERSION],[
+       AC_DEFINE_UNQUOTED([PACKAGE_VERSION_MAJOR],
+               [`echo $PACKAGE_VERSION | cut -d . -f 1`],
+               [Major version of this package])
+       PVM=`echo $PACKAGE_VERSION | cut -d . -f 2 | cut -d - -f 1`
+       if test "x$PVM" = "x"; then
+               PVM="0"
+       fi
+       AC_DEFINE_UNQUOTED([PACKAGE_VERSION_MINOR],
+               [$PVM],
+               [Minor version of this package])
+       PVP=`echo $PACKAGE_VERSION | cut -d . -f 3 | cut -d - -f 1`
+       if test "x$PVP" = "x"; then
+               PVP="0"
+       fi
+       AC_DEFINE_UNQUOTED([PACKAGE_VERSION_PATCHLEVEL],
+               [$PVP],
+               [Patch version of this package])
+])
+
+# XORG_CHANGELOG()
+# ----------------
+# Minimum version: 1.2.0
+#
+# Defines the variable CHANGELOG_CMD as the command to generate
+# ChangeLog from git.
+#
+#
+AC_DEFUN([XORG_CHANGELOG], [
+CHANGELOG_CMD="(GIT_DIR=\$(top_srcdir)/.git git log > \$(top_srcdir)/.changelog.tmp && \
+mv \$(top_srcdir)/.changelog.tmp \$(top_srcdir)/ChangeLog) \
+|| (rm -f \$(top_srcdir)/.changelog.tmp; touch \$(top_srcdir)/ChangeLog; \
+echo 'git directory not found: installing possibly empty changelog.' >&2)"
+AC_SUBST([CHANGELOG_CMD])
+]) # XORG_CHANGELOG
+
diff --git a/action.c b/action.c
new file mode 100644 (file)
index 0000000..3b82e64
--- /dev/null
+++ b/action.c
@@ -0,0 +1,1468 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 "xkbcomp.h"
+#include "tokens.h"
+#include "expr.h"
+
+#include "keycodes.h"
+#include "vmod.h"
+#include "misc.h"
+#include "action.h"
+#include "misc.h"
+
+static Bool actionsInitialized;
+static ExprDef constTrue;
+static ExprDef constFalse;
+
+/***====================================================================***/
+
+static Bool
+stringToAction(char *str, unsigned *type_rtrn)
+{
+    if (str == NULL)
+        return False;
+
+    if (uStrCaseCmp(str, "noaction") == 0)
+        *type_rtrn = XkbSA_NoAction;
+    else if (uStrCaseCmp(str, "setmods") == 0)
+        *type_rtrn = XkbSA_SetMods;
+    else if (uStrCaseCmp(str, "latchmods") == 0)
+        *type_rtrn = XkbSA_LatchMods;
+    else if (uStrCaseCmp(str, "lockmods") == 0)
+        *type_rtrn = XkbSA_LockMods;
+    else if (uStrCaseCmp(str, "setgroup") == 0)
+        *type_rtrn = XkbSA_SetGroup;
+    else if (uStrCaseCmp(str, "latchgroup") == 0)
+        *type_rtrn = XkbSA_LatchGroup;
+    else if (uStrCaseCmp(str, "lockgroup") == 0)
+        *type_rtrn = XkbSA_LockGroup;
+    else if (uStrCaseCmp(str, "moveptr") == 0)
+        *type_rtrn = XkbSA_MovePtr;
+    else if (uStrCaseCmp(str, "movepointer") == 0)
+        *type_rtrn = XkbSA_MovePtr;
+    else if (uStrCaseCmp(str, "ptrbtn") == 0)
+        *type_rtrn = XkbSA_PtrBtn;
+    else if (uStrCaseCmp(str, "pointerbutton") == 0)
+        *type_rtrn = XkbSA_PtrBtn;
+    else if (uStrCaseCmp(str, "lockptrbtn") == 0)
+        *type_rtrn = XkbSA_LockPtrBtn;
+    else if (uStrCaseCmp(str, "lockpointerbutton") == 0)
+        *type_rtrn = XkbSA_LockPtrBtn;
+    else if (uStrCaseCmp(str, "lockptrbutton") == 0)
+        *type_rtrn = XkbSA_LockPtrBtn;
+    else if (uStrCaseCmp(str, "lockpointerbtn") == 0)
+        *type_rtrn = XkbSA_LockPtrBtn;
+    else if (uStrCaseCmp(str, "setptrdflt") == 0)
+        *type_rtrn = XkbSA_SetPtrDflt;
+    else if (uStrCaseCmp(str, "setpointerdefault") == 0)
+        *type_rtrn = XkbSA_SetPtrDflt;
+    else if (uStrCaseCmp(str, "isolock") == 0)
+        *type_rtrn = XkbSA_ISOLock;
+    else if (uStrCaseCmp(str, "terminate") == 0)
+        *type_rtrn = XkbSA_Terminate;
+    else if (uStrCaseCmp(str, "terminateserver") == 0)
+        *type_rtrn = XkbSA_Terminate;
+    else if (uStrCaseCmp(str, "switchscreen") == 0)
+        *type_rtrn = XkbSA_SwitchScreen;
+    else if (uStrCaseCmp(str, "setcontrols") == 0)
+        *type_rtrn = XkbSA_SetControls;
+    else if (uStrCaseCmp(str, "lockcontrols") == 0)
+        *type_rtrn = XkbSA_LockControls;
+    else if (uStrCaseCmp(str, "actionmessage") == 0)
+        *type_rtrn = XkbSA_ActionMessage;
+    else if (uStrCaseCmp(str, "messageaction") == 0)
+        *type_rtrn = XkbSA_ActionMessage;
+    else if (uStrCaseCmp(str, "message") == 0)
+        *type_rtrn = XkbSA_ActionMessage;
+    else if (uStrCaseCmp(str, "redirect") == 0)
+        *type_rtrn = XkbSA_RedirectKey;
+    else if (uStrCaseCmp(str, "redirectkey") == 0)
+        *type_rtrn = XkbSA_RedirectKey;
+    else if (uStrCaseCmp(str, "devbtn") == 0)
+        *type_rtrn = XkbSA_DeviceBtn;
+    else if (uStrCaseCmp(str, "devicebtn") == 0)
+        *type_rtrn = XkbSA_DeviceBtn;
+    else if (uStrCaseCmp(str, "devbutton") == 0)
+        *type_rtrn = XkbSA_DeviceBtn;
+    else if (uStrCaseCmp(str, "devicebutton") == 0)
+        *type_rtrn = XkbSA_DeviceBtn;
+    else if (uStrCaseCmp(str, "lockdevbtn") == 0)
+        *type_rtrn = XkbSA_DeviceBtn;
+    else if (uStrCaseCmp(str, "lockdevicebtn") == 0)
+        *type_rtrn = XkbSA_LockDeviceBtn;
+    else if (uStrCaseCmp(str, "lockdevbutton") == 0)
+        *type_rtrn = XkbSA_LockDeviceBtn;
+    else if (uStrCaseCmp(str, "lockdevicebutton") == 0)
+        *type_rtrn = XkbSA_LockDeviceBtn;
+    else if (uStrCaseCmp(str, "devval") == 0)
+        *type_rtrn = XkbSA_DeviceValuator;
+    else if (uStrCaseCmp(str, "deviceval") == 0)
+        *type_rtrn = XkbSA_DeviceValuator;
+    else if (uStrCaseCmp(str, "devvaluator") == 0)
+        *type_rtrn = XkbSA_DeviceValuator;
+    else if (uStrCaseCmp(str, "devicevaluator") == 0)
+        *type_rtrn = XkbSA_DeviceValuator;
+    else if (uStrCaseCmp(str, "private") == 0)
+        *type_rtrn = PrivateAction;
+    else
+        return False;
+    return True;
+}
+
+static Bool
+stringToField(char *str, unsigned *field_rtrn)
+{
+
+    if (str == NULL)
+        return False;
+
+    if (uStrCaseCmp(str, "clearlocks") == 0)
+        *field_rtrn = F_ClearLocks;
+    else if (uStrCaseCmp(str, "latchtolock") == 0)
+        *field_rtrn = F_LatchToLock;
+    else if (uStrCaseCmp(str, "genkeyevent") == 0)
+        *field_rtrn = F_GenKeyEvent;
+    else if (uStrCaseCmp(str, "generatekeyevent") == 0)
+        *field_rtrn = F_GenKeyEvent;
+    else if (uStrCaseCmp(str, "report") == 0)
+        *field_rtrn = F_Report;
+    else if (uStrCaseCmp(str, "default") == 0)
+        *field_rtrn = F_Default;
+    else if (uStrCaseCmp(str, "affect") == 0)
+        *field_rtrn = F_Affect;
+    else if (uStrCaseCmp(str, "increment") == 0)
+        *field_rtrn = F_Increment;
+    else if (uStrCaseCmp(str, "mods") == 0)
+        *field_rtrn = F_Modifiers;
+    else if (uStrCaseCmp(str, "modifiers") == 0)
+        *field_rtrn = F_Modifiers;
+    else if (uStrCaseCmp(str, "group") == 0)
+        *field_rtrn = F_Group;
+    else if (uStrCaseCmp(str, "x") == 0)
+        *field_rtrn = F_X;
+    else if (uStrCaseCmp(str, "y") == 0)
+        *field_rtrn = F_Y;
+    else if (uStrCaseCmp(str, "accel") == 0)
+        *field_rtrn = F_Accel;
+    else if (uStrCaseCmp(str, "accelerate") == 0)
+        *field_rtrn = F_Accel;
+    else if (uStrCaseCmp(str, "repeat") == 0)
+        *field_rtrn = F_Accel;
+    else if (uStrCaseCmp(str, "button") == 0)
+        *field_rtrn = F_Button;
+    else if (uStrCaseCmp(str, "value") == 0)
+        *field_rtrn = F_Value;
+    else if (uStrCaseCmp(str, "controls") == 0)
+        *field_rtrn = F_Controls;
+    else if (uStrCaseCmp(str, "ctrls") == 0)
+        *field_rtrn = F_Controls;
+    else if (uStrCaseCmp(str, "type") == 0)
+        *field_rtrn = F_Type;
+    else if (uStrCaseCmp(str, "count") == 0)
+        *field_rtrn = F_Count;
+    else if (uStrCaseCmp(str, "screen") == 0)
+        *field_rtrn = F_Screen;
+    else if (uStrCaseCmp(str, "same") == 0)
+        *field_rtrn = F_Same;
+    else if (uStrCaseCmp(str, "sameserver") == 0)
+        *field_rtrn = F_Same;
+    else if (uStrCaseCmp(str, "data") == 0)
+        *field_rtrn = F_Data;
+    else if (uStrCaseCmp(str, "device") == 0)
+        *field_rtrn = F_Device;
+    else if (uStrCaseCmp(str, "dev") == 0)
+        *field_rtrn = F_Device;
+    else if (uStrCaseCmp(str, "key") == 0)
+        *field_rtrn = F_Keycode;
+    else if (uStrCaseCmp(str, "keycode") == 0)
+        *field_rtrn = F_Keycode;
+    else if (uStrCaseCmp(str, "kc") == 0)
+        *field_rtrn = F_Keycode;
+    else if (uStrCaseCmp(str, "clearmods") == 0)
+        *field_rtrn = F_ModsToClear;
+    else if (uStrCaseCmp(str, "clearmodifiers") == 0)
+        *field_rtrn = F_ModsToClear;
+    else
+        return False;
+    return True;
+}
+
+static char *
+fieldText(unsigned field)
+{
+    static char buf[32];
+
+    switch (field)
+    {
+    case F_ClearLocks:
+        strcpy(buf, "clearLocks");
+        break;
+    case F_LatchToLock:
+        strcpy(buf, "latchToLock");
+        break;
+    case F_GenKeyEvent:
+        strcpy(buf, "genKeyEvent");
+        break;
+    case F_Report:
+        strcpy(buf, "report");
+        break;
+    case F_Default:
+        strcpy(buf, "default");
+        break;
+    case F_Affect:
+        strcpy(buf, "affect");
+        break;
+    case F_Increment:
+        strcpy(buf, "increment");
+        break;
+    case F_Modifiers:
+        strcpy(buf, "modifiers");
+        break;
+    case F_Group:
+        strcpy(buf, "group");
+        break;
+    case F_X:
+        strcpy(buf, "x");
+        break;
+    case F_Y:
+        strcpy(buf, "y");
+        break;
+    case F_Accel:
+        strcpy(buf, "accel");
+        break;
+    case F_Button:
+        strcpy(buf, "button");
+        break;
+    case F_Value:
+        strcpy(buf, "value");
+        break;
+    case F_Controls:
+        strcpy(buf, "controls");
+        break;
+    case F_Type:
+        strcpy(buf, "type");
+        break;
+    case F_Count:
+        strcpy(buf, "count");
+        break;
+    case F_Screen:
+        strcpy(buf, "screen");
+        break;
+    case F_Same:
+        strcpy(buf, "sameServer");
+        break;
+    case F_Data:
+        strcpy(buf, "data");
+        break;
+    case F_Device:
+        strcpy(buf, "device");
+        break;
+    case F_Keycode:
+        strcpy(buf, "keycode");
+        break;
+    case F_ModsToClear:
+        strcpy(buf, "clearmods");
+        break;
+    default:
+        strcpy(buf, "unknown");
+        break;
+    }
+    return buf;
+}
+
+/***====================================================================***/
+
+static Bool
+ReportMismatch(unsigned action, unsigned field, const char *type)
+{
+    ERROR2("Value of %s field must be of type %s\n", fieldText(field), type);
+    ACTION1("Action %s definition ignored\n",
+            XkbActionTypeText(action, XkbMessage));
+    return False;
+}
+
+static Bool
+ReportIllegal(unsigned action, unsigned field)
+{
+    ERROR2("Field %s is not defined for an action of type %s\n",
+           fieldText(field), XkbActionTypeText(action, XkbMessage));
+    ACTION("Action definition ignored\n");
+    return False;
+}
+
+static Bool
+ReportActionNotArray(unsigned action, unsigned field)
+{
+    ERROR2("The %s field in the %s action is not an array\n",
+           fieldText(field), XkbActionTypeText(action, XkbMessage));
+    ACTION("Action definition ignored\n");
+    return False;
+}
+
+static Bool
+ReportNotFound(unsigned action, unsigned field, const char *what, char *bad)
+{
+    ERROR2("%s named %s not found\n", what, bad);
+    ACTION2("Ignoring the %s field of an %s action\n", fieldText(field),
+            XkbActionTypeText(action, XkbMessage));
+    return False;
+}
+
+static Bool
+HandleNoAction(XkbDescPtr xkb,
+               XkbAnyAction * action,
+               unsigned field, ExprDef * array_ndx, ExprDef * value)
+{
+    return ReportIllegal(action->type, field);
+}
+
+static Bool
+CheckLatchLockFlags(unsigned action,
+                    unsigned field, ExprDef * value, unsigned *flags_inout)
+{
+    unsigned tmp;
+    ExprResult result;
+
+    if (field == F_ClearLocks)
+        tmp = XkbSA_ClearLocks;
+    else if (field == F_LatchToLock)
+        tmp = XkbSA_LatchToLock;
+    else
+        return False;           /* WSGO! */
+    if (!ExprResolveBoolean(value, &result, NULL, NULL))
+        return ReportMismatch(action, field, "boolean");
+    if (result.uval)
+        *flags_inout |= tmp;
+    else
+        *flags_inout &= ~tmp;
+    return True;
+}
+
+static Bool
+CheckModifierField(XkbDescPtr xkb,
+                   unsigned action,
+                   ExprDef * value,
+                   unsigned *flags_inout, unsigned *mods_rtrn)
+{
+    ExprResult rtrn;
+
+    if (value->op == ExprIdent)
+    {
+        register char *valStr;
+        valStr = XkbAtomGetString(NULL, value->value.str);
+        if (valStr && ((uStrCaseCmp(valStr, "usemodmapmods") == 0) ||
+                       (uStrCaseCmp(valStr, "modmapmods") == 0)))
+        {
+
+            *mods_rtrn = 0;
+            *flags_inout |= XkbSA_UseModMapMods;
+            return True;
+        }
+    }
+    if (!ExprResolveModMask(value, &rtrn, LookupVModMask, (XPointer) xkb))
+        return ReportMismatch(action, F_Modifiers, "modifier mask");
+    *mods_rtrn = rtrn.uval;
+    *flags_inout &= ~XkbSA_UseModMapMods;
+    return True;
+}
+
+static Bool
+HandleSetLatchMods(XkbDescPtr xkb,
+                   XkbAnyAction * action,
+                   unsigned field, ExprDef * array_ndx, ExprDef * value)
+{
+    XkbModAction *act;
+    unsigned rtrn;
+    unsigned t1, t2;
+
+    act = (XkbModAction *) action;
+    if (array_ndx != NULL)
+    {
+        switch (field)
+        {
+        case F_ClearLocks:
+        case F_LatchToLock:
+        case F_Modifiers:
+            return ReportActionNotArray(action->type, field);
+        }
+    }
+    switch (field)
+    {
+    case F_ClearLocks:
+    case F_LatchToLock:
+        rtrn = act->flags;
+        if (CheckLatchLockFlags(action->type, field, value, &rtrn))
+        {
+            act->flags = rtrn;
+            return True;
+        }
+        return False;
+    case F_Modifiers:
+        t1 = act->flags;
+        if (CheckModifierField(xkb, action->type, value, &t1, &t2))
+        {
+            act->flags = t1;
+            act->real_mods = act->mask = (t2 & 0xff);
+            t2 = (t2 >> 8) & 0xffff;
+            XkbSetModActionVMods(act, t2);
+            return True;
+        }
+        return False;
+    }
+    return ReportIllegal(action->type, field);
+}
+
+static Bool
+HandleLockMods(XkbDescPtr xkb,
+               XkbAnyAction * action,
+               unsigned field, ExprDef * array_ndx, ExprDef * value)
+{
+    XkbModAction *act;
+    unsigned t1, t2;
+
+    act = (XkbModAction *) action;
+    if ((array_ndx != NULL) && (field == F_Modifiers))
+        return ReportActionNotArray(action->type, field);
+    switch (field)
+    {
+    case F_Modifiers:
+        t1 = act->flags;
+        if (CheckModifierField(xkb, action->type, value, &t1, &t2))
+        {
+            act->flags = t1;
+            act->real_mods = act->mask = (t2 & 0xff);
+            t2 = (t2 >> 8) & 0xffff;
+            XkbSetModActionVMods(act, t2);
+            return True;
+        }
+        return False;
+    }
+    return ReportIllegal(action->type, field);
+}
+
+static LookupEntry groupNames[] = {
+    {"group1", 1},
+    {"group2", 2},
+    {"group3", 3},
+    {"group4", 4},
+    {"group5", 5},
+    {"group6", 6},
+    {"group7", 7},
+    {"group8", 8},
+    {NULL, 0},
+};
+
+static Bool
+CheckGroupField(unsigned action,
+                ExprDef * value, unsigned *flags_inout, int *grp_rtrn)
+{
+    ExprDef *spec;
+    ExprResult rtrn;
+
+    if ((value->op == OpNegate) || (value->op == OpUnaryPlus))
+    {
+        *flags_inout &= ~XkbSA_GroupAbsolute;
+        spec = value->value.child;
+    }
+    else
+    {
+        *flags_inout |= XkbSA_GroupAbsolute;
+        spec = value;
+    }
+
+    if (!ExprResolveInteger(spec, &rtrn, SimpleLookup, (XPointer) groupNames))
+        return ReportMismatch(action, F_Group, "integer (range 1..8)");
+    if ((rtrn.ival < 1) || (rtrn.ival > XkbNumKbdGroups))
+    {
+        ERROR2("Illegal group %d (must be in the range 1..%d)\n", rtrn.ival,
+               XkbNumKbdGroups);
+        ACTION1("Action %s definition ignored\n",
+                XkbActionTypeText(action, XkbMessage));
+        return False;
+    }
+    if (value->op == OpNegate)
+        *grp_rtrn = -rtrn.ival;
+    else if (value->op == OpUnaryPlus)
+        *grp_rtrn = rtrn.ival;
+    else
+        *grp_rtrn = rtrn.ival - 1;
+    return True;
+}
+
+static Bool
+HandleSetLatchGroup(XkbDescPtr xkb,
+                    XkbAnyAction * action,
+                    unsigned field, ExprDef * array_ndx, ExprDef * value)
+{
+    XkbGroupAction *act;
+    unsigned rtrn;
+    unsigned t1;
+    int t2;
+
+    act = (XkbGroupAction *) action;
+    if (array_ndx != NULL)
+    {
+        switch (field)
+        {
+        case F_ClearLocks:
+        case F_LatchToLock:
+        case F_Group:
+            return ReportActionNotArray(action->type, field);
+        }
+    }
+    switch (field)
+    {
+    case F_ClearLocks:
+    case F_LatchToLock:
+        rtrn = act->flags;
+        if (CheckLatchLockFlags(action->type, field, value, &rtrn))
+        {
+            act->flags = rtrn;
+            return True;
+        }
+        return False;
+    case F_Group:
+        t1 = act->flags;
+        if (CheckGroupField(action->type, value, &t1, &t2))
+        {
+            act->flags = t1;
+            XkbSASetGroup(act, t2);
+            return True;
+        }
+        return False;
+    }
+    return ReportIllegal(action->type, field);
+}
+
+static Bool
+HandleLockGroup(XkbDescPtr xkb,
+                XkbAnyAction * action,
+                unsigned field, ExprDef * array_ndx, ExprDef * value)
+{
+    XkbGroupAction *act;
+    unsigned t1;
+    int t2;
+
+    act = (XkbGroupAction *) action;
+    if ((array_ndx != NULL) && (field == F_Group))
+        return ReportActionNotArray(action->type, field);
+    if (field == F_Group)
+    {
+        t1 = act->flags;
+        if (CheckGroupField(action->type, value, &t1, &t2))
+        {
+            act->flags = t1;
+            XkbSASetGroup(act, t2);
+            return True;
+        }
+        return False;
+    }
+    return ReportIllegal(action->type, field);
+}
+
+static Bool
+HandleMovePtr(XkbDescPtr xkb,
+              XkbAnyAction * action,
+              unsigned field, ExprDef * array_ndx, ExprDef * value)
+{
+    ExprResult rtrn;
+    XkbPtrAction *act;
+    Bool absolute;
+
+    act = (XkbPtrAction *) action;
+    if ((array_ndx != NULL) && ((field == F_X) || (field == F_Y)))
+        return ReportActionNotArray(action->type, field);
+
+    if ((field == F_X) || (field == F_Y))
+    {
+        if ((value->op == OpNegate) || (value->op == OpUnaryPlus))
+            absolute = False;
+        else
+            absolute = True;
+        if (!ExprResolveInteger(value, &rtrn, NULL, NULL))
+            return ReportMismatch(action->type, field, "integer");
+        if (field == F_X)
+        {
+            if (absolute)
+                act->flags |= XkbSA_MoveAbsoluteX;
+            XkbSetPtrActionX(act, rtrn.ival);
+        }
+        else
+        {
+            if (absolute)
+                act->flags |= XkbSA_MoveAbsoluteY;
+            XkbSetPtrActionY(act, rtrn.ival);
+        }
+        return True;
+    }
+    else if (field == F_Accel)
+    {
+        if (!ExprResolveBoolean(value, &rtrn, NULL, NULL))
+            return ReportMismatch(action->type, field, "boolean");
+        if (rtrn.uval)
+            act->flags &= ~XkbSA_NoAcceleration;
+        else
+            act->flags |= XkbSA_NoAcceleration;
+    }
+    return ReportIllegal(action->type, field);
+}
+
+static LookupEntry btnNames[] = {
+    {"button1", 1},
+    {"button2", 2},
+    {"button3", 3},
+    {"button4", 4},
+    {"button5", 5},
+    {"default", 0},
+    {NULL, 0}
+};
+
+static LookupEntry lockWhich[] = {
+    {"both", 0},
+    {"lock", XkbSA_LockNoUnlock},
+    {"neither", (XkbSA_LockNoLock | XkbSA_LockNoUnlock)},
+    {"unlock", XkbSA_LockNoLock},
+    {NULL, 0}
+};
+
+static Bool
+HandlePtrBtn(XkbDescPtr xkb,
+             XkbAnyAction * action,
+             unsigned field, ExprDef * array_ndx, ExprDef * value)
+{
+    ExprResult rtrn;
+    XkbPtrBtnAction *act;
+
+    act = (XkbPtrBtnAction *) action;
+    if (field == F_Button)
+    {
+        if (array_ndx != NULL)
+            return ReportActionNotArray(action->type, field);
+        if (!ExprResolveInteger
+            (value, &rtrn, SimpleLookup, (XPointer) btnNames))
+            return ReportMismatch(action->type, field,
+                                  "integer (range 1..5)");
+        if ((rtrn.ival < 0) || (rtrn.ival > 5))
+        {
+            ERROR("Button must specify default or be in the range 1..5\n");
+            ACTION1("Illegal button value %d ignored\n", rtrn.ival);
+            return False;
+        }
+        act->button = rtrn.ival;
+        return True;
+    }
+    else if ((action->type == XkbSA_LockPtrBtn) && (field == F_Affect))
+    {
+        if (array_ndx != NULL)
+            return ReportActionNotArray(action->type, field);
+        if (!ExprResolveEnum(value, &rtrn, lockWhich))
+            return ReportMismatch(action->type, field, "lock or unlock");
+        act->flags &= ~(XkbSA_LockNoLock | XkbSA_LockNoUnlock);
+        act->flags |= rtrn.ival;
+        return True;
+    }
+    else if (field == F_Count)
+    {
+        if (array_ndx != NULL)
+            return ReportActionNotArray(action->type, field);
+        if (!ExprResolveInteger
+            (value, &rtrn, SimpleLookup, (XPointer) btnNames))
+            return ReportMismatch(action->type, field, "integer");
+        if ((rtrn.ival < 0) || (rtrn.ival > 255))
+        {
+            ERROR("The count field must have a value in the range 0..255\n");
+            ACTION1("Illegal count %d ignored\n", rtrn.ival);
+            return False;
+        }
+        act->count = rtrn.ival;
+        return True;
+    }
+    return ReportIllegal(action->type, field);
+}
+
+static LookupEntry ptrDflts[] = {
+    {"dfltbtn", XkbSA_AffectDfltBtn},
+    {"defaultbutton", XkbSA_AffectDfltBtn},
+    {"button", XkbSA_AffectDfltBtn},
+    {NULL, 0}
+};
+
+static Bool
+HandleSetPtrDflt(XkbDescPtr xkb,
+                 XkbAnyAction * action,
+                 unsigned field, ExprDef * array_ndx, ExprDef * value)
+{
+    ExprResult rtrn;
+    XkbPtrDfltAction *act;
+
+    act = (XkbPtrDfltAction *) action;
+    if (field == F_Affect)
+    {
+        if (array_ndx != NULL)
+            return ReportActionNotArray(action->type, field);
+        if (!ExprResolveEnum(value, &rtrn, ptrDflts))
+            return ReportMismatch(action->type, field, "pointer component");
+        act->affect = rtrn.uval;
+        return True;
+    }
+    else if ((field == F_Button) || (field == F_Value))
+    {
+        ExprDef *btn;
+        if (array_ndx != NULL)
+            return ReportActionNotArray(action->type, field);
+        if ((value->op == OpNegate) || (value->op == OpUnaryPlus))
+        {
+            act->flags &= ~XkbSA_DfltBtnAbsolute;
+            btn = value->value.child;
+        }
+        else
+        {
+            act->flags |= XkbSA_DfltBtnAbsolute;
+            btn = value;
+        }
+
+        if (!ExprResolveInteger
+            (btn, &rtrn, SimpleLookup, (XPointer) btnNames))
+            return ReportMismatch(action->type, field,
+                                  "integer (range 1..5)");
+        if ((rtrn.ival < 0) || (rtrn.ival > 5))
+        {
+            ERROR("New default button value must be in the range 1..5\n");
+            ACTION1("Illegal default button value %d ignored\n", rtrn.ival);
+            return False;
+        }
+        if (rtrn.ival == 0)
+        {
+            ERROR("Cannot set default pointer button to \"default\"\n");
+            ACTION("Illegal default button setting ignored\n");
+            return False;
+        }
+        if (value->op == OpNegate)
+            XkbSASetPtrDfltValue(act, -rtrn.ival);
+        else
+            XkbSASetPtrDfltValue(act, rtrn.ival);
+        return True;
+    }
+    return ReportIllegal(action->type, field);
+}
+
+static LookupEntry isoNames[] = {
+    {"mods", XkbSA_ISONoAffectMods},
+    {"modifiers", XkbSA_ISONoAffectMods},
+    {"group", XkbSA_ISONoAffectGroup},
+    {"groups", XkbSA_ISONoAffectGroup},
+    {"ptr", XkbSA_ISONoAffectPtr},
+    {"pointer", XkbSA_ISONoAffectPtr},
+    {"ctrls", XkbSA_ISONoAffectCtrls},
+    {"controls", XkbSA_ISONoAffectCtrls},
+    {"all", ~((unsigned) 0)},
+    {"none", 0},
+    {NULL, 0},
+};
+
+static Bool
+HandleISOLock(XkbDescPtr xkb,
+              XkbAnyAction * action,
+              unsigned field, ExprDef * array_ndx, ExprDef * value)
+{
+    ExprResult rtrn;
+    XkbISOAction *act;
+    unsigned flags, mods;
+    int group;
+
+    act = (XkbISOAction *) action;
+    switch (field)
+    {
+    case F_Modifiers:
+        if (array_ndx != NULL)
+            return ReportActionNotArray(action->type, field);
+        flags = act->flags;
+        if (CheckModifierField(xkb, action->type, value, &flags, &mods))
+        {
+            act->flags = flags & (~XkbSA_ISODfltIsGroup);
+            act->real_mods = mods & 0xff;
+            mods = (mods >> 8) & 0xff;
+            XkbSetModActionVMods(act, mods);
+            return True;
+        }
+        return False;
+    case F_Group:
+        if (array_ndx != NULL)
+            return ReportActionNotArray(action->type, field);
+        flags = act->flags;
+        if (CheckGroupField(action->type, value, &flags, &group))
+        {
+            act->flags = flags | XkbSA_ISODfltIsGroup;
+            XkbSASetGroup(act, group);
+            return True;
+        }
+        return False;
+    case F_Affect:
+        if (array_ndx != NULL)
+            return ReportActionNotArray(action->type, field);
+        if (!ExprResolveMask(value, &rtrn, SimpleLookup, (XPointer) isoNames))
+            return ReportMismatch(action->type, field, "keyboard component");
+        act->affect = (~rtrn.uval) & XkbSA_ISOAffectMask;
+        return True;
+    }
+    return ReportIllegal(action->type, field);
+}
+
+static Bool
+HandleSwitchScreen(XkbDescPtr xkb,
+                   XkbAnyAction * action,
+                   unsigned field, ExprDef * array_ndx, ExprDef * value)
+{
+    ExprResult rtrn;
+    XkbSwitchScreenAction *act;
+
+    act = (XkbSwitchScreenAction *) action;
+    if (field == F_Screen)
+    {
+        ExprDef *scrn;
+        if (array_ndx != NULL)
+            return ReportActionNotArray(action->type, field);
+        if ((value->op == OpNegate) || (value->op == OpUnaryPlus))
+        {
+            act->flags &= ~XkbSA_SwitchAbsolute;
+            scrn = value->value.child;
+        }
+        else
+        {
+            act->flags |= XkbSA_SwitchAbsolute;
+            scrn = value;
+        }
+
+        if (!ExprResolveInteger(scrn, &rtrn, NULL, NULL))
+            return ReportMismatch(action->type, field, "integer (0..255)");
+        if ((rtrn.ival < 0) || (rtrn.ival > 255))
+        {
+            ERROR("Screen index must be in the range 1..255\n");
+            ACTION1("Illegal screen value %d ignored\n", rtrn.ival);
+            return False;
+        }
+        if (value->op == OpNegate)
+            XkbSASetScreen(act, -rtrn.ival);
+        else
+            XkbSASetScreen(act, rtrn.ival);
+        return True;
+    }
+    else if (field == F_Same)
+    {
+        if (array_ndx != NULL)
+            return ReportActionNotArray(action->type, field);
+        if (!ExprResolveBoolean(value, &rtrn, NULL, NULL))
+            return ReportMismatch(action->type, field, "boolean");
+        if (rtrn.uval)
+            act->flags &= ~XkbSA_SwitchApplication;
+        else
+            act->flags |= XkbSA_SwitchApplication;
+        return True;
+    }
+    return ReportIllegal(action->type, field);
+}
+
+LookupEntry ctrlNames[] = {
+    {"repeatkeys", XkbRepeatKeysMask}
+    ,
+    {"repeat", XkbRepeatKeysMask}
+    ,
+    {"autorepeat", XkbRepeatKeysMask}
+    ,
+    {"slowkeys", XkbSlowKeysMask}
+    ,
+    {"bouncekeys", XkbBounceKeysMask}
+    ,
+    {"stickykeys", XkbStickyKeysMask}
+    ,
+    {"mousekeys", XkbMouseKeysMask}
+    ,
+    {"mousekeysaccel", XkbMouseKeysAccelMask}
+    ,
+    {"accessxkeys", XkbAccessXKeysMask}
+    ,
+    {"accessxtimeout", XkbAccessXTimeoutMask}
+    ,
+    {"accessxfeedback", XkbAccessXFeedbackMask}
+    ,
+    {"audiblebell", XkbAudibleBellMask}
+    ,
+    {"overlay1", XkbOverlay1Mask}
+    ,
+    {"overlay2", XkbOverlay2Mask}
+    ,
+    {"ignoregrouplock", XkbIgnoreGroupLockMask}
+    ,
+    {"all", XkbAllBooleanCtrlsMask}
+    ,
+    {"none", 0}
+    ,
+    {NULL, 0}
+};
+
+static Bool
+HandleSetLockControls(XkbDescPtr xkb,
+                      XkbAnyAction * action,
+                      unsigned field, ExprDef * array_ndx, ExprDef * value)
+{
+    ExprResult rtrn;
+    XkbCtrlsAction *act;
+
+    act = (XkbCtrlsAction *) action;
+    if (field == F_Controls)
+    {
+        if (array_ndx != NULL)
+            return ReportActionNotArray(action->type, field);
+        if (!ExprResolveMask
+            (value, &rtrn, SimpleLookup, (XPointer) ctrlNames))
+            return ReportMismatch(action->type, field, "controls mask");
+        XkbActionSetCtrls(act, rtrn.uval);
+        return True;
+    }
+    return ReportIllegal(action->type, field);
+}
+
+static LookupEntry evNames[] = {
+    {"press", XkbSA_MessageOnPress},
+    {"keypress", XkbSA_MessageOnPress},
+    {"release", XkbSA_MessageOnRelease},
+    {"keyrelease", XkbSA_MessageOnRelease},
+    {"all", XkbSA_MessageOnPress | XkbSA_MessageOnRelease},
+    {"none", 0},
+    {NULL, 0}
+};
+
+static Bool
+HandleActionMessage(XkbDescPtr xkb,
+                    XkbAnyAction * action,
+                    unsigned field, ExprDef * array_ndx, ExprDef * value)
+{
+    ExprResult rtrn;
+    XkbMessageAction *act;
+
+    act = (XkbMessageAction *) action;
+    switch (field)
+    {
+    case F_Report:
+        if (array_ndx != NULL)
+            return ReportActionNotArray(action->type, field);
+        if (!ExprResolveMask(value, &rtrn, SimpleLookup, (XPointer) evNames))
+            return ReportMismatch(action->type, field, "key event mask");
+        act->flags &= ~(XkbSA_MessageOnPress | XkbSA_MessageOnRelease);
+        act->flags =
+            rtrn.uval & (XkbSA_MessageOnPress | XkbSA_MessageOnRelease);
+        return True;
+    case F_GenKeyEvent:
+        if (array_ndx != NULL)
+            return ReportActionNotArray(action->type, field);
+        if (!ExprResolveBoolean(value, &rtrn, NULL, NULL))
+            return ReportMismatch(action->type, field, "boolean");
+        if (rtrn.uval)
+            act->flags |= XkbSA_MessageGenKeyEvent;
+        else
+            act->flags &= ~XkbSA_MessageGenKeyEvent;
+        return True;
+    case F_Data:
+        if (array_ndx == NULL)
+        {
+            if (!ExprResolveString(value, &rtrn, NULL, NULL))
+                return ReportMismatch(action->type, field, "string");
+            else
+            {
+                int len = strlen(rtrn.str);
+                if ((len < 1) || (len > 6))
+                {
+                    WARN("An action message can hold only 6 bytes\n");
+                    ACTION1("Extra %d bytes ignored\n", len - 6);
+                }
+                strncpy((char *) act->message, rtrn.str, 6);
+            }
+            return True;
+        }
+        else
+        {
+            unsigned ndx;
+            if (!ExprResolveInteger(array_ndx, &rtrn, NULL, NULL))
+            {
+                ERROR("Array subscript must be integer\n");
+                ACTION("Illegal subscript ignored\n");
+                return False;
+            }
+            ndx = rtrn.uval;
+            if (ndx > 5)
+            {
+                ERROR("An action message is at most 6 bytes long\n");
+                ACTION1("Attempt to use data[%d] ignored\n", ndx);
+                return False;
+            }
+            if (!ExprResolveInteger(value, &rtrn, NULL, NULL))
+                return ReportMismatch(action->type, field, "integer");
+            if ((rtrn.ival < 0) || (rtrn.ival > 255))
+            {
+                ERROR("Message data must be in the range 0..255\n");
+                ACTION1("Illegal datum %d ignored\n", rtrn.ival);
+                return False;
+            }
+            act->message[ndx] = rtrn.uval;
+        }
+        return True;
+    }
+    return ReportIllegal(action->type, field);
+}
+
+static Bool
+HandleRedirectKey(XkbDescPtr xkb,
+                  XkbAnyAction * action,
+                  unsigned field, ExprDef * array_ndx, ExprDef * value)
+{
+    ExprResult rtrn;
+    XkbRedirectKeyAction *act;
+    unsigned t1, t2, vmods, vmask;
+    unsigned long tmp;
+
+    if (array_ndx != NULL)
+        return ReportActionNotArray(action->type, field);
+
+    act = (XkbRedirectKeyAction *) action;
+    switch (field)
+    {
+    case F_Keycode:
+        if (!ExprResolveKeyName(value, &rtrn, NULL, NULL))
+            return ReportMismatch(action->type, field, "key name");
+        tmp = KeyNameToLong(rtrn.keyName.name);
+        if (!FindNamedKey(xkb, tmp, &t1, True, CreateKeyNames(xkb), 0))
+        {
+            return ReportNotFound(action->type, field, "Key",
+                                  XkbKeyNameText(rtrn.keyName.name,
+                                                 XkbMessage));
+        }
+        act->new_key = t1;
+        return True;
+    case F_ModsToClear:
+    case F_Modifiers:
+        t1 = 0;
+        if (CheckModifierField(xkb, action->type, value, &t1, &t2))
+        {
+            act->mods_mask |= (t2 & 0xff);
+            if (field == F_Modifiers)
+                act->mods |= (t2 & 0xff);
+            else
+                act->mods &= ~(t2 & 0xff);
+
+            t2 = (t2 >> 8) & 0xffff;
+            vmods = XkbSARedirectVMods(act);
+            vmask = XkbSARedirectVModsMask(act);
+            vmask |= t2;
+            if (field == F_Modifiers)
+                vmods |= t2;
+            else
+                vmods &= ~t2;
+            XkbSARedirectSetVMods(act, vmods);
+            XkbSARedirectSetVModsMask(act, vmask);
+            return True;
+        }
+        return True;
+    }
+    return ReportIllegal(action->type, field);
+}
+
+static Bool
+HandleDeviceBtn(XkbDescPtr xkb,
+                XkbAnyAction * action,
+                unsigned field, ExprDef * array_ndx, ExprDef * value)
+{
+    ExprResult rtrn;
+    XkbDeviceBtnAction *act;
+
+    act = (XkbDeviceBtnAction *) action;
+    if (field == F_Button)
+    {
+        if (array_ndx != NULL)
+            return ReportActionNotArray(action->type, field);
+        if (!ExprResolveInteger(value, &rtrn, NULL, NULL))
+            return ReportMismatch(action->type, field,
+                                  "integer (range 1..255)");
+        if ((rtrn.ival < 0) || (rtrn.ival > 255))
+        {
+            ERROR("Button must specify default or be in the range 1..255\n");
+            ACTION1("Illegal button value %d ignored\n", rtrn.ival);
+            return False;
+        }
+        act->button = rtrn.ival;
+        return True;
+    }
+    else if ((action->type == XkbSA_LockDeviceBtn) && (field == F_Affect))
+    {
+        if (array_ndx != NULL)
+            return ReportActionNotArray(action->type, field);
+        if (!ExprResolveEnum(value, &rtrn, lockWhich))
+            return ReportMismatch(action->type, field, "lock or unlock");
+        act->flags &= ~(XkbSA_LockNoLock | XkbSA_LockNoUnlock);
+        act->flags |= rtrn.ival;
+        return True;
+    }
+    else if (field == F_Count)
+    {
+        if (array_ndx != NULL)
+            return ReportActionNotArray(action->type, field);
+        if (!ExprResolveInteger
+            (value, &rtrn, SimpleLookup, (XPointer) btnNames))
+            return ReportMismatch(action->type, field, "integer");
+        if ((rtrn.ival < 0) || (rtrn.ival > 255))
+        {
+            ERROR("The count field must have a value in the range 0..255\n");
+            ACTION1("Illegal count %d ignored\n", rtrn.ival);
+            return False;
+        }
+        act->count = rtrn.ival;
+        return True;
+    }
+    else if (field == F_Device)
+    {
+        if (array_ndx != NULL)
+            return ReportActionNotArray(action->type, field);
+        if (!ExprResolveInteger(value, &rtrn, NULL, NULL))
+            return ReportMismatch(action->type, field,
+                                  "integer (range 1..255)");
+        if ((rtrn.ival < 0) || (rtrn.ival > 255))
+        {
+            ERROR("Device must specify default or be in the range 1..255\n");
+            ACTION1("Illegal device value %d ignored\n", rtrn.ival);
+            return False;
+        }
+        act->device = rtrn.ival;
+        return True;
+    }
+    return ReportIllegal(action->type, field);
+}
+
+static Bool
+HandleDeviceValuator(XkbDescPtr xkb,
+                     XkbAnyAction * action,
+                     unsigned field, ExprDef * array_ndx, ExprDef * value)
+{
+#if 0
+    ExprResult rtrn;
+    XkbDeviceValuatorAction *act;
+
+    act = (XkbDeviceValuatorAction *) action;
+    /*  XXX - Not yet implemented */
+#endif
+    return False;
+}
+
+static Bool
+HandlePrivate(XkbDescPtr xkb,
+              XkbAnyAction * action,
+              unsigned field, ExprDef * array_ndx, ExprDef * value)
+{
+    ExprResult rtrn;
+
+    switch (field)
+    {
+    case F_Type:
+        if (!ExprResolveInteger(value, &rtrn, NULL, NULL))
+            return ReportMismatch(PrivateAction, field, "integer");
+        if ((rtrn.ival < 0) || (rtrn.ival > 255))
+        {
+            ERROR("Private action type must be in the range 0..255\n");
+            ACTION1("Illegal type %d ignored\n", rtrn.ival);
+            return False;
+        }
+        action->type = rtrn.uval;
+        return True;
+    case F_Data:
+        if (array_ndx == NULL)
+        {
+            if (!ExprResolveString(value, &rtrn, NULL, NULL))
+                return ReportMismatch(action->type, field, "string");
+            else
+            {
+                int len = strlen(rtrn.str);
+                if ((len < 1) || (len > 7))
+                {
+                    WARN("A private action has 7 data bytes\n");
+                    ACTION1("Extra %d bytes ignored\n", len - 6);
+                    return False;
+                }
+                strncpy((char *) action->data, rtrn.str, 7);
+            }
+            return True;
+        }
+        else
+        {
+            unsigned ndx;
+            if (!ExprResolveInteger(array_ndx, &rtrn, NULL, NULL))
+            {
+                ERROR("Array subscript must be integer\n");
+                ACTION("Illegal subscript ignored\n");
+                return False;
+            }
+            ndx = rtrn.uval;
+            if (ndx > 6)
+            {
+                ERROR("The data for a private action is 7 bytes long\n");
+                ACTION1("Attempt to use data[%d] ignored\n", ndx);
+                return False;
+            }
+            if (!ExprResolveInteger(value, &rtrn, NULL, NULL))
+                return ReportMismatch(action->type, field, "integer");
+            if ((rtrn.ival < 0) || (rtrn.ival > 255))
+            {
+                ERROR("All data for a private action must be 0..255\n");
+                ACTION1("Illegal datum %d ignored\n", rtrn.ival);
+                return False;
+            }
+            action->data[ndx] = rtrn.uval;
+            return True;
+        }
+    }
+    return ReportIllegal(PrivateAction, field);
+}
+
+typedef Bool(*actionHandler) (XkbDescPtr /* xkb */ ,
+                              XkbAnyAction * /* action */ ,
+                              unsigned /* field */ ,
+                              ExprDef * /* array_ndx */ ,
+                              ExprDef * /* value */
+    );
+
+static actionHandler handleAction[XkbSA_NumActions + 1] = {
+    HandleNoAction /* NoAction     */ ,
+    HandleSetLatchMods /* SetMods      */ ,
+    HandleSetLatchMods /* LatchMods    */ ,
+    HandleLockMods /* LockMods     */ ,
+    HandleSetLatchGroup /* SetGroup     */ ,
+    HandleSetLatchGroup /* LatchGroup   */ ,
+    HandleLockGroup /* LockGroup    */ ,
+    HandleMovePtr /* MovePtr      */ ,
+    HandlePtrBtn /* PtrBtn       */ ,
+    HandlePtrBtn /* LockPtrBtn   */ ,
+    HandleSetPtrDflt /* SetPtrDflt   */ ,
+    HandleISOLock /* ISOLock      */ ,
+    HandleNoAction /* Terminate    */ ,
+    HandleSwitchScreen /* SwitchScreen */ ,
+    HandleSetLockControls /* SetControls  */ ,
+    HandleSetLockControls /* LockControls */ ,
+    HandleActionMessage /* ActionMessage */ ,
+    HandleRedirectKey /* RedirectKey  */ ,
+    HandleDeviceBtn /* DeviceBtn    */ ,
+    HandleDeviceBtn /* LockDeviceBtn */ ,
+    HandleDeviceValuator /* DeviceValuatr */ ,
+    HandlePrivate               /* Private      */
+};
+
+/***====================================================================***/
+
+static void
+ApplyActionFactoryDefaults(XkbAction * action)
+{
+    if (action->type == XkbSA_SetPtrDflt)
+    {                           /* increment default button */
+        action->dflt.affect = XkbSA_AffectDfltBtn;
+        action->dflt.flags = 0;
+        XkbSASetPtrDfltValue(&action->dflt, 1);
+    }
+    else if (action->type == XkbSA_ISOLock)
+    {
+        action->iso.real_mods = LockMask;
+    }
+    return;
+}
+
+
+int
+HandleActionDef(ExprDef * def,
+                XkbDescPtr xkb,
+                XkbAnyAction * action, unsigned mergeMode, ActionInfo * info)
+{
+    ExprDef *arg;
+    register char *str;
+    unsigned tmp, hndlrType;
+
+    if (!actionsInitialized)
+        ActionsInit();
+
+    if (def->op != ExprActionDecl)
+    {
+        ERROR1("Expected an action definition, found %s\n",
+               exprOpText(def->op));
+        return False;
+    }
+    str = XkbAtomGetString(NULL, def->value.action.name);
+    if (!str)
+    {
+        WSGO("Missing name in action definition!!\n");
+        return False;
+    }
+    if (!stringToAction(str, &tmp))
+    {
+        ERROR1("Unknown action %s\n", str);
+        return False;
+    }
+    action->type = hndlrType = tmp;
+    if (action->type != XkbSA_NoAction)
+    {
+        ApplyActionFactoryDefaults((XkbAction *) action);
+        while (info)
+        {
+            if ((info->action == XkbSA_NoAction)
+                || (info->action == hndlrType))
+            {
+                if (!(*handleAction[hndlrType]) (xkb, action,
+                                                 info->field,
+                                                 info->array_ndx,
+                                                 info->value))
+                {
+                    return False;
+                }
+            }
+            info = info->next;
+        }
+    }
+    for (arg = def->value.action.args; arg != NULL;
+         arg = (ExprDef *) arg->common.next)
+    {
+        ExprDef *field, *value, *arrayRtrn;
+        ExprResult elemRtrn, fieldRtrn;
+        unsigned fieldNdx;
+
+        if (arg->op == OpAssign)
+        {
+            field = arg->value.binary.left;
+            value = arg->value.binary.right;
+        }
+        else
+        {
+            if ((arg->op == OpNot) || (arg->op == OpInvert))
+            {
+                field = arg->value.child;
+                value = &constFalse;
+            }
+            else
+            {
+                field = arg;
+                value = &constTrue;
+            }
+        }
+        if (!ExprResolveLhs(field, &elemRtrn, &fieldRtrn, &arrayRtrn))
+            return False;       /* internal error -- already reported */
+
+        if (elemRtrn.str != NULL)
+        {
+            ERROR("Cannot change defaults in an action definition\n");
+            ACTION2("Ignoring attempt to change %s.%s\n", elemRtrn.str,
+                    fieldRtrn.str);
+            return False;
+        }
+        if (!stringToField(fieldRtrn.str, &fieldNdx))
+        {
+            ERROR1("Unknown field name %s\n", uStringText(fieldRtrn.str));
+            return False;
+        }
+        if (!(*handleAction[hndlrType])
+            (xkb, action, fieldNdx, arrayRtrn, value))
+        {
+            return False;
+        }
+    }
+    return True;
+}
+
+/***====================================================================***/
+
+int
+SetActionField(XkbDescPtr xkb,
+               char *elem,
+               char *field,
+               ExprDef * array_ndx, ExprDef * value, ActionInfo ** info_rtrn)
+{
+    ActionInfo *new, *old;
+
+    if (!actionsInitialized)
+        ActionsInit();
+
+    new = uTypedAlloc(ActionInfo);
+    if (new == NULL)
+    {
+        WSGO("Couldn't allocate space for action default\n");
+        return False;
+    }
+    if (uStrCaseCmp(elem, "action") == 0)
+        new->action = XkbSA_NoAction;
+    else
+    {
+        if (!stringToAction(elem, &new->action))
+            return False;
+        if (new->action == XkbSA_NoAction)
+        {
+            ERROR1("\"%s\" is not a valid field in a NoAction action\n",
+                   field);
+            return False;
+        }
+    }
+    if (!stringToField(field, &new->field))
+    {
+        ERROR1("\"%s\" is not a legal field name\n", field);
+        return False;
+    }
+    new->array_ndx = array_ndx;
+    new->value = value;
+    new->next = NULL;
+    old = *info_rtrn;
+    while ((old) && (old->next))
+        old = old->next;
+    if (old == NULL)
+        *info_rtrn = new;
+    else
+        old->next = new;
+    return True;
+}
+
+/***====================================================================***/
+
+void
+ActionsInit(void)
+{
+    if (!actionsInitialized)
+    {
+        bzero((char *) &constTrue, sizeof(constTrue));
+        bzero((char *) &constFalse, sizeof(constFalse));
+        constTrue.common.stmtType = StmtExpr;
+        constTrue.common.next = NULL;
+        constTrue.op = ExprIdent;
+        constTrue.type = TypeBoolean;
+        constTrue.value.str = XkbInternAtom(NULL, "true", False);
+        constFalse.common.stmtType = StmtExpr;
+        constFalse.common.next = NULL;
+        constFalse.op = ExprIdent;
+        constFalse.type = TypeBoolean;
+        constFalse.value.str = XkbInternAtom(NULL, "false", False);
+        actionsInitialized = 1;
+    }
+    return;
+}
diff --git a/action.h b/action.h
new file mode 100644 (file)
index 0000000..2fb7a5e
--- /dev/null
+++ b/action.h
@@ -0,0 +1,86 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 ACTION_H
+#define ACTION_H 1
+
+#define        F_ClearLocks    0
+#define        F_LatchToLock   1
+#define        F_GenKeyEvent   2
+#define        F_Report        3
+#define        F_Default       4
+#define        F_Affect        5
+#define        F_Increment     6
+#define        F_Modifiers     7
+#define        F_Group         8
+#define        F_X             9
+#define        F_Y             10
+#define        F_Accel         11
+#define        F_Button        12
+#define        F_Value         13
+#define        F_Controls      14
+#define        F_Type          15
+#define        F_Count         16
+#define        F_Screen        17
+#define        F_Same          18
+#define        F_Data          19
+#define        F_Device        20
+#define        F_Keycode       21
+#define        F_ModsToClear   22
+#define        F_LastField     F_ModsToClear
+#define        F_NumFields     (F_LastField+1)
+
+#define        PrivateAction   (XkbSA_LastAction+1)
+
+typedef struct _ActionInfo
+{
+    unsigned action;
+    unsigned field;
+    ExprDef *array_ndx;
+    ExprDef *value;
+    struct _ActionInfo *next;
+} ActionInfo;
+
+extern int HandleActionDef(ExprDef * /* def */ ,
+                           XkbDescPtr /* xkb */ ,
+                           XkbAnyAction * /* action */ ,
+                           unsigned /* mergeMode */ ,
+                           ActionInfo * /* info */
+    );
+
+extern int SetActionField(XkbDescPtr /* xkb */ ,
+                          char * /* elem */ ,
+                          char * /* field */ ,
+                          ExprDef * /* index */ ,
+                          ExprDef * /* value */ ,
+                          ActionInfo ** /* info_rtrn */
+    );
+
+extern void ActionsInit(void);
+
+extern LookupEntry ctrlNames[];
+
+#endif /* ACTION_H */
diff --git a/alias.c b/alias.c
new file mode 100644 (file)
index 0000000..f28c2d2
--- /dev/null
+++ b/alias.c
@@ -0,0 +1,289 @@
+/************************************************************
+ Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 "xkbcomp.h"
+#include "misc.h"
+#include "alias.h"
+#include "keycodes.h"
+
+#include <X11/extensions/XKBgeom.h>
+
+static void
+HandleCollision(AliasInfo * old, AliasInfo * new)
+{
+    if (strncmp(new->real, old->real, XkbKeyNameLength) == 0)
+    {
+        if (((new->def.fileID == old->def.fileID) && (warningLevel > 0)) ||
+            (warningLevel > 9))
+        {
+            WARN2("Alias of %s for %s declared more than once\n",
+                  XkbKeyNameText(new->alias, XkbMessage),
+                  XkbKeyNameText(new->real, XkbMessage));
+            ACTION("First definition ignored\n");
+        }
+    }
+    else
+    {
+        char *use, *ignore;
+        if (new->def.merge == MergeAugment)
+        {
+            use = old->real;
+            ignore = new->real;
+        }
+        else
+        {
+            use = new->real;
+            ignore = old->real;
+        }
+        if (((old->def.fileID == new->def.fileID) && (warningLevel > 0)) ||
+            (warningLevel > 9))
+        {
+            WARN1("Multiple definitions for alias %s\n",
+                  XkbKeyNameText(old->alias, XkbMessage));
+            ACTION2("Using %s, ignoring %s\n",
+                    XkbKeyNameText(use, XkbMessage),
+                    XkbKeyNameText(ignore, XkbMessage));
+        }
+        if (use != old->real)
+            memcpy(old->real, use, XkbKeyNameLength);
+    }
+    old->def.fileID = new->def.fileID;
+    old->def.merge = new->def.merge;
+    return;
+}
+
+static void
+InitAliasInfo(AliasInfo * info,
+              unsigned merge, unsigned file_id, char *alias, char *real)
+{
+    bzero(info, sizeof(AliasInfo));
+    info->def.merge = merge;
+    info->def.fileID = file_id;
+    strncpy(info->alias, alias, XkbKeyNameLength);
+    strncpy(info->real, real, XkbKeyNameLength);
+    return;
+}
+
+int
+HandleAliasDef(KeyAliasDef * def,
+               unsigned merge, unsigned file_id, AliasInfo ** info_in)
+{
+    AliasInfo *info;
+
+    for (info = *info_in; info != NULL; info = (AliasInfo *) info->def.next)
+    {
+        if (strncmp(info->alias, def->alias, XkbKeyNameLength) == 0)
+        {
+            AliasInfo new;
+            InitAliasInfo(&new, merge, file_id, def->alias, def->real);
+            HandleCollision(info, &new);
+            return True;
+        }
+    }
+    info = uTypedCalloc(1, AliasInfo);
+    if (info == NULL)
+    {
+        WSGO("Allocation failure in HandleAliasDef\n");
+        return False;
+    }
+    info->def.fileID = file_id;
+    info->def.merge = merge;
+    info->def.next = (CommonInfo *) * info_in;
+    memcpy(info->alias, def->alias, XkbKeyNameLength);
+    memcpy(info->real, def->real, XkbKeyNameLength);
+    *info_in = (AliasInfo *) AddCommonInfo(&(*info_in)->def, &info->def);
+    return True;
+}
+
+void
+ClearAliases(AliasInfo ** info_in)
+{
+    if ((info_in) && (*info_in))
+        ClearCommonInfo(&(*info_in)->def);
+    return;
+}
+
+Bool
+MergeAliases(AliasInfo ** into, AliasInfo ** merge, unsigned how_merge)
+{
+    AliasInfo *tmp;
+    KeyAliasDef def;
+
+    if ((*merge) == NULL)
+        return True;
+    if ((*into) == NULL)
+    {
+        *into = *merge;
+        *merge = NULL;
+        return True;
+    }
+    bzero((char *) &def, sizeof(KeyAliasDef));
+    for (tmp = *merge; tmp != NULL; tmp = (AliasInfo *) tmp->def.next)
+    {
+        if (how_merge == MergeDefault)
+            def.merge = tmp->def.merge;
+        else
+            def.merge = how_merge;
+        memcpy(def.alias, tmp->alias, XkbKeyNameLength);
+        memcpy(def.real, tmp->real, XkbKeyNameLength);
+        if (!HandleAliasDef(&def, def.merge, tmp->def.fileID, into))
+            return False;
+    }
+    return True;
+}
+
+int
+ApplyAliases(XkbDescPtr xkb, Bool toGeom, AliasInfo ** info_in)
+{
+    register int i;
+    XkbKeyAliasPtr old, a;
+    AliasInfo *info;
+    int nNew, nOld;
+    Status status;
+
+    if (*info_in == NULL)
+        return True;
+    if (toGeom)
+    {
+        nOld = (xkb->geom ? xkb->geom->num_key_aliases : 0);
+        old = (xkb->geom ? xkb->geom->key_aliases : NULL);
+    }
+    else
+    {
+        nOld = (xkb->names ? xkb->names->num_key_aliases : 0);
+        old = (xkb->names ? xkb->names->key_aliases : NULL);
+    }
+    for (nNew = 0, info = *info_in; info != NULL;
+         info = (AliasInfo *) info->def.next)
+    {
+        unsigned long lname;
+        unsigned int kc;
+
+        lname = KeyNameToLong(info->real);
+        if (!FindNamedKey(xkb, lname, &kc, False, CreateKeyNames(xkb), 0))
+        {
+            if (warningLevel > 4)
+            {
+                WARN2("Attempt to alias %s to non-existent key %s\n",
+                      XkbKeyNameText(info->alias, XkbMessage),
+                      XkbKeyNameText(info->real, XkbMessage));
+                ACTION("Ignored\n");
+            }
+            info->alias[0] = '\0';
+            continue;
+        }
+        lname = KeyNameToLong(info->alias);
+        if (FindNamedKey(xkb, lname, &kc, False, False, 0))
+        {
+            if (warningLevel > 4)
+            {
+                WARN("Attempt to create alias with the name of a real key\n");
+                ACTION2("Alias \"%s = %s\" ignored\n",
+                        XkbKeyNameText(info->alias, XkbMessage),
+                        XkbKeyNameText(info->real, XkbMessage));
+            }
+            info->alias[0] = '\0';
+            continue;
+        }
+        nNew++;
+        if (old)
+        {
+            for (i = 0, a = old; i < nOld; i++, a++)
+            {
+                if (strncmp(a->alias, info->alias, XkbKeyNameLength) == 0)
+                {
+                    AliasInfo oldai;
+                    InitAliasInfo(&oldai, MergeAugment, 0, a->alias, a->real);
+                    HandleCollision(&oldai, info);
+                    memcpy(oldai.real, a->real, XkbKeyNameLength);
+                    info->alias[0] = '\0';
+                    nNew--;
+                    break;
+                }
+            }
+        }
+    }
+    if (nNew == 0)
+    {
+        ClearCommonInfo(&(*info_in)->def);
+        *info_in = NULL;
+        return True;
+    }
+    status = Success;
+    if (toGeom)
+    {
+        if (!xkb->geom)
+        {
+            XkbGeometrySizesRec sizes;
+            bzero((char *) &sizes, sizeof(XkbGeometrySizesRec));
+            sizes.which = XkbGeomKeyAliasesMask;
+            sizes.num_key_aliases = nOld + nNew;
+            status = XkbAllocGeometry(xkb, &sizes);
+        }
+        else
+        {
+            status = XkbAllocGeomKeyAliases(xkb->geom, nOld + nNew);
+        }
+        if (xkb->geom)
+            old = xkb->geom->key_aliases;
+    }
+    else
+    {
+        status = XkbAllocNames(xkb, XkbKeyAliasesMask, 0, nOld + nNew);
+        if (xkb->names)
+            old = xkb->names->key_aliases;
+    }
+    if (status != Success)
+    {
+        WSGO("Allocation failure in ApplyAliases\n");
+        return False;
+    }
+    if (toGeom)
+        a = &xkb->geom->key_aliases[nOld];
+    else
+        a = &xkb->names->key_aliases[nOld];
+    for (info = *info_in; info != NULL; info = (AliasInfo *) info->def.next)
+    {
+        if (info->alias[0] != '\0')
+        {
+            strncpy(a->alias, info->alias, XkbKeyNameLength);
+            strncpy(a->real, info->real, XkbKeyNameLength);
+            a++;
+        }
+    }
+#ifdef DEBUG
+    if ((a - old) != (nOld + nNew))
+    {
+        WSGO2("Expected %d aliases total but created %d\n", nOld + nNew,
+              (int)(a - old));
+    }
+#endif
+    if (toGeom)
+        xkb->geom->num_key_aliases += nNew;
+    ClearCommonInfo(&(*info_in)->def);
+    *info_in = NULL;
+    return True;
+}
diff --git a/alias.h b/alias.h
new file mode 100644 (file)
index 0000000..b6fac5b
--- /dev/null
+++ b/alias.h
@@ -0,0 +1,56 @@
+/************************************************************
+ Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 ALIAS_H
+#define ALIAS_H 1
+
+typedef struct _AliasInfo
+{
+    CommonInfo def;
+    char alias[XkbKeyNameLength + 1];
+    char real[XkbKeyNameLength + 1];
+} AliasInfo;
+
+extern int HandleAliasDef(KeyAliasDef * /* def   */ ,
+                          unsigned /* merge */ ,
+                          unsigned /* file_id */ ,
+                          AliasInfo **  /* info  */
+    );
+
+extern void ClearAliases(AliasInfo **   /* info */
+    );
+
+extern Bool MergeAliases(AliasInfo ** /* into */ ,
+                         AliasInfo ** /* merge */ ,
+                         unsigned       /* how_merge */
+    );
+
+extern int ApplyAliases(XkbDescPtr /* xkb */ ,
+                        Bool /* toGeom */ ,
+                        AliasInfo **    /* info */
+    );
+
+#endif /* ALIAS_H */
diff --git a/compat.c b/compat.c
new file mode 100644 (file)
index 0000000..2b00142
--- /dev/null
+++ b/compat.c
@@ -0,0 +1,889 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 <X11/Xos.h>
+#include "xkbcomp.h"
+#include "tokens.h"
+#include "expr.h"
+#include "vmod.h"
+#include "misc.h"
+#include "indicators.h"
+#include "action.h"
+#include "compat.h"
+
+typedef struct _SymInterpInfo
+{
+    CommonInfo defs;
+    XkbSymInterpretRec interp;
+} SymInterpInfo;
+
+#define        _SI_VirtualMod          (1<<0)
+#define        _SI_Action              (1<<1)
+#define        _SI_AutoRepeat          (1<<2)
+#define        _SI_LockingKey          (1<<3)
+#define        _SI_LevelOneOnly        (1<<4)
+
+typedef struct _GroupCompatInfo
+{
+    unsigned char fileID;
+    unsigned char merge;
+    Bool defined;
+    unsigned char real_mods;
+    unsigned short vmods;
+} GroupCompatInfo;
+
+typedef struct _CompatInfo
+{
+    char *name;
+    unsigned fileID;
+    int errorCount;
+    int nInterps;
+    SymInterpInfo *interps;
+    SymInterpInfo dflt;
+    LEDInfo ledDflt;
+    GroupCompatInfo groupCompat[XkbNumKbdGroups];
+    LEDInfo *leds;
+    VModInfo vmods;
+    ActionInfo *act;
+    XkbDescPtr xkb;
+} CompatInfo;
+
+/***====================================================================***/
+
+#define        ReportSINotArray(si,f,i) \
+       ReportNotArray("symbol interpretation",(f),siText((si),(i)))
+#define        ReportSIBadType(si,f,w,i) \
+       ReportBadType("symbol interpretation",(f),siText((si),(i)),(w))
+
+/***====================================================================***/
+
+static char *
+siText(SymInterpInfo * si, CompatInfo * info)
+{
+    static char buf[128];
+
+    if (si == &info->dflt)
+    {
+        snprintf(buf, sizeof(buf), "default");
+    }
+    else
+    {
+        snprintf(buf, sizeof(buf), "%s+%s(%s)", 
+               XkbKeysymText(si->interp.sym, XkbMessage),
+                XkbSIMatchText(si->interp.match, XkbMessage),
+                XkbModMaskText(si->interp.mods, XkbMessage));
+    }
+    return buf;
+}
+
+static void
+InitCompatInfo(CompatInfo * info, XkbDescPtr xkb)
+{
+    register int i;
+
+    info->xkb = xkb;
+    info->name = NULL;
+    info->fileID = 0;
+    info->errorCount = 0;
+    info->nInterps = 0;
+    info->interps = NULL;
+    info->act = NULL;
+    info->dflt.defs.fileID = info->fileID;
+    info->dflt.defs.defined = 0;
+    info->dflt.defs.merge = MergeOverride;
+    info->dflt.interp.flags = 0;
+    info->dflt.interp.virtual_mod = XkbNoModifier;
+    info->dflt.interp.act.type = XkbSA_NoAction;
+    for (i = 0; i < XkbAnyActionDataSize; i++)
+    {
+        info->dflt.interp.act.data[i] = 0;
+    }
+    ClearIndicatorMapInfo(xkb->dpy, &info->ledDflt);
+    info->ledDflt.defs.fileID = info->fileID;
+    info->ledDflt.defs.defined = 0;
+    info->ledDflt.defs.merge = MergeOverride;
+    bzero((char *) &info->groupCompat[0],
+          XkbNumKbdGroups * sizeof(GroupCompatInfo));
+    info->leds = NULL;
+    InitVModInfo(&info->vmods, xkb);
+    return;
+}
+
+static void
+ClearCompatInfo(CompatInfo * info, XkbDescPtr xkb)
+{
+    register int i;
+
+    if (info->name != NULL)
+        uFree(info->name);
+    info->name = NULL;
+    info->dflt.defs.defined = 0;
+    info->dflt.defs.merge = MergeAugment;
+    info->dflt.interp.flags = 0;
+    info->dflt.interp.virtual_mod = XkbNoModifier;
+    info->dflt.interp.act.type = XkbSA_NoAction;
+    for (i = 0; i < XkbAnyActionDataSize; i++)
+    {
+        info->dflt.interp.act.data[i] = 0;
+    }
+    ClearIndicatorMapInfo(xkb->dpy, &info->ledDflt);
+    info->nInterps = 0;
+    info->interps = (SymInterpInfo *) ClearCommonInfo(&info->interps->defs);
+    bzero((char *) &info->groupCompat[0],
+          XkbNumKbdGroups * sizeof(GroupCompatInfo));
+    info->leds = (LEDInfo *) ClearCommonInfo(&info->leds->defs);
+    /* 3/30/94 (ef) -- XXX! Should free action info here */
+    ClearVModInfo(&info->vmods, xkb);
+    return;
+}
+
+static SymInterpInfo *
+NextInterp(CompatInfo * info)
+{
+    SymInterpInfo *si;
+
+    si = uTypedAlloc(SymInterpInfo);
+    if (si)
+    {
+        bzero((char *) si, sizeof(SymInterpInfo));
+        info->interps =
+            (SymInterpInfo *) AddCommonInfo(&info->interps->defs,
+                                            (CommonInfo *) si);
+        info->nInterps++;
+    }
+    return si;
+}
+
+static SymInterpInfo *
+FindMatchingInterp(CompatInfo * info, SymInterpInfo * new)
+{
+    SymInterpInfo *old;
+
+    for (old = info->interps; old != NULL;
+         old = (SymInterpInfo *) old->defs.next)
+    {
+        if ((old->interp.sym == new->interp.sym) &&
+            (old->interp.mods == new->interp.mods) &&
+            (old->interp.match == new->interp.match))
+        {
+            return old;
+        }
+    }
+    return NULL;
+}
+
+static Bool
+AddInterp(CompatInfo * info, SymInterpInfo * new)
+{
+    unsigned collide;
+    SymInterpInfo *old;
+
+    collide = 0;
+    old = FindMatchingInterp(info, new);
+    if (old != NULL)
+    {
+        if (new->defs.merge == MergeReplace)
+        {
+            SymInterpInfo *next = (SymInterpInfo *) old->defs.next;
+            if (((old->defs.fileID == new->defs.fileID)
+                 && (warningLevel > 0)) || (warningLevel > 9))
+            {
+                WARN1("Multiple definitions for \"%s\"\n", siText(new, info));
+                ACTION("Earlier interpretation ignored\n");
+            }
+            *old = *new;
+            old->defs.next = &next->defs;
+            return True;
+        }
+        if (UseNewField(_SI_VirtualMod, &old->defs, &new->defs, &collide))
+        {
+            old->interp.virtual_mod = new->interp.virtual_mod;
+            old->defs.defined |= _SI_VirtualMod;
+        }
+        if (UseNewField(_SI_Action, &old->defs, &new->defs, &collide))
+        {
+            old->interp.act = new->interp.act;
+            old->defs.defined |= _SI_Action;
+        }
+        if (UseNewField(_SI_AutoRepeat, &old->defs, &new->defs, &collide))
+        {
+            old->interp.flags &= ~XkbSI_AutoRepeat;
+            old->interp.flags |= (new->interp.flags & XkbSI_AutoRepeat);
+            old->defs.defined |= _SI_AutoRepeat;
+        }
+        if (UseNewField(_SI_LockingKey, &old->defs, &new->defs, &collide))
+        {
+            old->interp.flags &= ~XkbSI_LockingKey;
+            old->interp.flags |= (new->interp.flags & XkbSI_LockingKey);
+            old->defs.defined |= _SI_LockingKey;
+        }
+        if (UseNewField(_SI_LevelOneOnly, &old->defs, &new->defs, &collide))
+        {
+            old->interp.match &= ~XkbSI_LevelOneOnly;
+            old->interp.match |= (new->interp.match & XkbSI_LevelOneOnly);
+            old->defs.defined |= _SI_LevelOneOnly;
+        }
+        if (collide)
+        {
+            WARN1("Multiple interpretations of \"%s\"\n", siText(new, info));
+            ACTION1("Using %s definition for duplicate fields\n",
+                    (new->defs.merge != MergeAugment ? "last" : "first"));
+        }
+        return True;
+    }
+    old = new;
+    if ((new = NextInterp(info)) == NULL)
+        return False;
+    *new = *old;
+    new->defs.next = NULL;
+    return True;
+}
+
+static Bool
+AddGroupCompat(CompatInfo * info, unsigned group, GroupCompatInfo * newGC)
+{
+    GroupCompatInfo *gc;
+    unsigned merge;
+
+    merge = newGC->merge;
+    gc = &info->groupCompat[group];
+    if (((gc->real_mods == newGC->real_mods) && (gc->vmods == newGC->vmods)))
+    {
+        return True;
+    }
+    if (((gc->fileID == newGC->fileID) && (warningLevel > 0))
+        || (warningLevel > 9))
+    {
+        WARN1("Compat map for group %d redefined\n", group + 1);
+        ACTION1("Using %s definition\n",
+                (merge == MergeAugment ? "old" : "new"));
+    }
+    if(newGC->defined && (merge != MergeAugment || !gc->defined))
+       *gc = *newGC;
+    return True;
+}
+
+/***====================================================================***/
+
+static Bool
+ResolveStateAndPredicate(ExprDef * expr,
+                         unsigned *pred_rtrn,
+                         unsigned *mods_rtrn, CompatInfo * info)
+{
+    ExprResult result;
+
+    if (expr == NULL)
+    {
+        *pred_rtrn = XkbSI_AnyOfOrNone;
+        *mods_rtrn = ~0;
+        return True;
+    }
+
+    *pred_rtrn = XkbSI_Exactly;
+    if (expr->op == ExprActionDecl)
+    {
+        char *pred_txt =
+            XkbAtomText(NULL, expr->value.action.name, XkbMessage);
+        if (uStrCaseCmp(pred_txt, "noneof") == 0)
+            *pred_rtrn = XkbSI_NoneOf;
+        else if (uStrCaseCmp(pred_txt, "anyofornone") == 0)
+            *pred_rtrn = XkbSI_AnyOfOrNone;
+        else if (uStrCaseCmp(pred_txt, "anyof") == 0)
+            *pred_rtrn = XkbSI_AnyOf;
+        else if (uStrCaseCmp(pred_txt, "allof") == 0)
+            *pred_rtrn = XkbSI_AllOf;
+        else if (uStrCaseCmp(pred_txt, "exactly") == 0)
+            *pred_rtrn = XkbSI_Exactly;
+        else
+        {
+            ERROR1("Illegal modifier predicate \"%s\"\n", pred_txt);
+            ACTION("Ignored\n");
+            return False;
+        }
+        expr = expr->value.action.args;
+    }
+    else if (expr->op == ExprIdent)
+    {
+        char *pred_txt = XkbAtomText(NULL, expr->value.str, XkbMessage);
+        if ((pred_txt) && (uStrCaseCmp(pred_txt, "any") == 0))
+        {
+            *pred_rtrn = XkbSI_AnyOf;
+            *mods_rtrn = 0xff;
+            return True;
+        }
+    }
+
+    if (ExprResolveModMask(expr, &result, NULL, NULL))
+    {
+        *mods_rtrn = result.uval;
+        return True;
+    }
+    return False;
+}
+
+/***====================================================================***/
+
+static void
+MergeIncludedCompatMaps(CompatInfo * into, CompatInfo * from, unsigned merge)
+{
+    SymInterpInfo *si;
+    LEDInfo *led, *rtrn, *next;
+    GroupCompatInfo *gcm;
+    register int i;
+
+    if (from->errorCount > 0)
+    {
+        into->errorCount += from->errorCount;
+        return;
+    }
+    if (into->name == NULL)
+    {
+        into->name = from->name;
+        from->name = NULL;
+    }
+    for (si = from->interps; si; si = (SymInterpInfo *) si->defs.next)
+    {
+        if (merge != MergeDefault)
+            si->defs.merge = merge;
+        if (!AddInterp(into, si))
+            into->errorCount++;
+    }
+    for (i = 0, gcm = &from->groupCompat[0]; i < XkbNumKbdGroups; i++, gcm++)
+    {
+        if (merge != MergeDefault)
+            gcm->merge = merge;
+        if (!AddGroupCompat(into, i, gcm))
+            into->errorCount++;
+    }
+    for (led = from->leds; led != NULL; led = next)
+    {
+        next = (LEDInfo *) led->defs.next;
+        if (merge != MergeDefault)
+            led->defs.merge = merge;
+        rtrn = AddIndicatorMap(into->leds, led);
+        if (rtrn != NULL)
+            into->leds = rtrn;
+        else
+            into->errorCount++;
+    }
+    return;
+}
+
+typedef void (*FileHandler) (XkbFile * /* rtrn */ ,
+                             XkbDescPtr /* xkb */ ,
+                             unsigned /* merge */ ,
+                             CompatInfo *       /* info */
+    );
+
+static Bool
+HandleIncludeCompatMap(IncludeStmt * stmt,
+                       XkbDescPtr xkb, CompatInfo * info, FileHandler hndlr)
+{
+    unsigned newMerge;
+    XkbFile *rtrn;
+    CompatInfo included;
+    Bool haveSelf;
+
+    haveSelf = False;
+    if ((stmt->file == NULL) && (stmt->map == NULL))
+    {
+        haveSelf = True;
+        included = *info;
+        bzero(info, sizeof(CompatInfo));
+    }
+    else if (ProcessIncludeFile(stmt, XkmCompatMapIndex, &rtrn, &newMerge))
+    {
+        InitCompatInfo(&included, xkb);
+        included.fileID = rtrn->id;
+        included.dflt = info->dflt;
+        included.dflt.defs.fileID = rtrn->id;
+        included.dflt.defs.merge = newMerge;
+        included.ledDflt.defs.fileID = rtrn->id;
+        included.ledDflt.defs.merge = newMerge;
+        included.act = info->act;
+        (*hndlr) (rtrn, xkb, MergeOverride, &included);
+        if (stmt->stmt != NULL)
+        {
+            if (included.name != NULL)
+                uFree(included.name);
+            included.name = stmt->stmt;
+            stmt->stmt = NULL;
+        }
+    }
+    else
+    {
+        info->errorCount += 10;
+        return False;
+    }
+    if ((stmt->next != NULL) && (included.errorCount < 1))
+    {
+        IncludeStmt *next;
+        unsigned op;
+        CompatInfo next_incl;
+
+        for (next = stmt->next; next != NULL; next = next->next)
+        {
+            if ((next->file == NULL) && (next->map == NULL))
+            {
+                haveSelf = True;
+                MergeIncludedCompatMaps(&included, info, next->merge);
+                ClearCompatInfo(info, xkb);
+            }
+            else if (ProcessIncludeFile(next, XkmCompatMapIndex, &rtrn, &op))
+            {
+                InitCompatInfo(&next_incl, xkb);
+                next_incl.fileID = rtrn->id;
+                next_incl.dflt = info->dflt;
+                next_incl.dflt.defs.fileID = rtrn->id;
+                next_incl.dflt.defs.merge = op;
+                next_incl.ledDflt.defs.fileID = rtrn->id;
+                next_incl.ledDflt.defs.merge = op;
+                next_incl.act = info->act;
+                (*hndlr) (rtrn, xkb, MergeOverride, &next_incl);
+                MergeIncludedCompatMaps(&included, &next_incl, op);
+                ClearCompatInfo(&next_incl, xkb);
+            }
+            else
+            {
+                info->errorCount += 10;
+                return False;
+            }
+        }
+    }
+    if (haveSelf)
+        *info = included;
+    else
+    {
+        MergeIncludedCompatMaps(info, &included, newMerge);
+        ClearCompatInfo(&included, xkb);
+    }
+    return (info->errorCount == 0);
+}
+
+static LookupEntry useModMapValues[] = {
+    {"levelone", 1},
+    {"level1", 1},
+    {"anylevel", 0},
+    {"any", 0},
+    {NULL, 0}
+};
+
+static int
+SetInterpField(SymInterpInfo * si,
+               XkbDescPtr xkb,
+               char *field,
+               ExprDef * arrayNdx, ExprDef * value, CompatInfo * info)
+{
+    int ok = 1;
+    ExprResult tmp;
+
+    if (uStrCaseCmp(field, "action") == 0)
+    {
+        if (arrayNdx != NULL)
+            return ReportSINotArray(si, field, info);
+        ok = HandleActionDef(value, xkb, &si->interp.act, si->defs.merge,
+                             info->act);
+        if (ok)
+            si->defs.defined |= _SI_Action;
+    }
+    else if ((uStrCaseCmp(field, "virtualmodifier") == 0) ||
+             (uStrCaseCmp(field, "virtualmod") == 0))
+    {
+        if (arrayNdx != NULL)
+            return ReportSINotArray(si, field, info);
+        ok = ResolveVirtualModifier(value, &tmp, &info->vmods);
+        if (ok)
+        {
+            si->interp.virtual_mod = tmp.uval;
+            si->defs.defined |= _SI_VirtualMod;
+        }
+        else
+            return ReportSIBadType(si, field, "virtual modifier", info);
+    }
+    else if (uStrCaseCmp(field, "repeat") == 0)
+    {
+        if (arrayNdx != NULL)
+            return ReportSINotArray(si, field, info);
+        ok = ExprResolveBoolean(value, &tmp, NULL, NULL);
+        if (ok)
+        {
+            if (tmp.uval)
+                si->interp.flags |= XkbSI_AutoRepeat;
+            else
+                si->interp.flags &= ~XkbSI_AutoRepeat;
+            si->defs.defined |= _SI_AutoRepeat;
+        }
+        else
+            return ReportSIBadType(si, field, "boolean", info);
+    }
+    else if (uStrCaseCmp(field, "locking") == 0)
+    {
+        if (arrayNdx != NULL)
+            return ReportSINotArray(si, field, info);
+        ok = ExprResolveBoolean(value, &tmp, NULL, NULL);
+        if (ok)
+        {
+            if (tmp.uval)
+                si->interp.flags |= XkbSI_LockingKey;
+            else
+                si->interp.flags &= ~XkbSI_LockingKey;
+            si->defs.defined |= _SI_LockingKey;
+        }
+        else
+            return ReportSIBadType(si, field, "boolean", info);
+    }
+    else if ((uStrCaseCmp(field, "usemodmap") == 0) ||
+             (uStrCaseCmp(field, "usemodmapmods") == 0))
+    {
+        if (arrayNdx != NULL)
+            return ReportSINotArray(si, field, info);
+        ok = ExprResolveEnum(value, &tmp, useModMapValues);
+        if (ok)
+        {
+            if (tmp.uval)
+                si->interp.match |= XkbSI_LevelOneOnly;
+            else
+                si->interp.match &= ~XkbSI_LevelOneOnly;
+            si->defs.defined |= _SI_LevelOneOnly;
+        }
+        else
+            return ReportSIBadType(si, field, "level specification", info);
+    }
+    else
+    {
+        ok = ReportBadField("symbol interpretation", field, siText(si, info));
+    }
+    return ok;
+}
+
+LookupEntry groupNames[] = {
+    {"group1", 0x01}
+    ,
+    {"group2", 0x02}
+    ,
+    {"group3", 0x04}
+    ,
+    {"group4", 0x08}
+    ,
+    {"group5", 0x10}
+    ,
+    {"group6", 0x20}
+    ,
+    {"group7", 0x40}
+    ,
+    {"group8", 0x80}
+    ,
+    {"none", 0x00}
+    ,
+    {"all", 0xff}
+    ,
+    {NULL, 0}
+};
+
+static int
+HandleInterpVar(VarDef * stmt, XkbDescPtr xkb, CompatInfo * info)
+{
+    ExprResult elem, field;
+    ExprDef *ndx;
+
+    if (ExprResolveLhs(stmt->name, &elem, &field, &ndx) == 0)
+        return 0;               /* internal error, already reported */
+    if (elem.str && (uStrCaseCmp(elem.str, "interpret") == 0))
+        return SetInterpField(&info->dflt, xkb, field.str, ndx, stmt->value,
+                              info);
+    if (elem.str && (uStrCaseCmp(elem.str, "indicator") == 0))
+    {
+        return SetIndicatorMapField(&info->ledDflt, xkb, field.str, ndx,
+                                    stmt->value);
+    }
+    return SetActionField(xkb, elem.str, field.str, ndx, stmt->value,
+                          &info->act);
+}
+
+static int
+HandleInterpBody(VarDef * def, XkbDescPtr xkb, SymInterpInfo * si,
+                 CompatInfo * info)
+{
+    int ok = 1;
+    ExprResult tmp, field;
+    ExprDef *arrayNdx;
+
+    for (; def != NULL; def = (VarDef *) def->common.next)
+    {
+        if ((def->name) && (def->name->type == ExprFieldRef))
+        {
+            ok = HandleInterpVar(def, xkb, info);
+            continue;
+        }
+        ok = ExprResolveLhs(def->name, &tmp, &field, &arrayNdx);
+        if (ok)
+            ok = SetInterpField(si, xkb, field.str, arrayNdx, def->value,
+                                info);
+    }
+    return ok;
+}
+
+static int
+HandleInterpDef(InterpDef * def, XkbDescPtr xkb, unsigned merge,
+                CompatInfo * info)
+{
+    unsigned pred, mods;
+    SymInterpInfo si;
+
+    if (!ResolveStateAndPredicate(def->match, &pred, &mods, info))
+    {
+        ERROR("Couldn't determine matching modifiers\n");
+        ACTION("Symbol interpretation ignored\n");
+        return True;
+    }
+    if (def->ignore)
+    {
+        ERROR("Couldn't lookup keysym\n");
+        ACTION("Symbol interpretation ignored\n");
+        return True;
+    }
+
+    if (def->merge != MergeDefault)
+        merge = def->merge;
+
+    si = info->dflt;
+    si.defs.merge = merge;
+    si.interp.sym = def->sym;
+    si.interp.match = pred & XkbSI_OpMask;
+    si.interp.mods = mods;
+    if (!HandleInterpBody(def->def, xkb, &si, info))
+    {
+        info->errorCount++;
+        return False;
+    }
+
+    if (!AddInterp(info, &si))
+    {
+        info->errorCount++;
+        return False;
+    }
+    return True;
+}
+
+static int
+HandleGroupCompatDef(GroupCompatDef * def,
+                     XkbDescPtr xkb, unsigned merge, CompatInfo * info)
+{
+    ExprResult val;
+    GroupCompatInfo tmp;
+
+    if (def->merge != MergeDefault)
+        merge = def->merge;
+    if (!XkbIsLegalGroup(def->group - 1))
+    {
+        ERROR1("Keyboard group must be in the range 1..%d\n",
+               XkbNumKbdGroups + 1);
+        ACTION1("Compatibility map for illegal group %d ignored\n",
+                def->group);
+        return False;
+    }
+    tmp.fileID = info->fileID;
+    tmp.merge = merge;
+    if (!ExprResolveModMask(def->def, &val, LookupVModMask, (XPointer) xkb))
+    {
+        ERROR("Expected a modifier mask in group compatibility definition\n");
+        ACTION1("Ignoring illegal compatibility map for group %d\n",
+                def->group);
+        return False;
+    }
+    tmp.real_mods = val.uval & 0xff;
+    tmp.vmods = (val.uval >> 8) & 0xffff;
+    tmp.defined = True;
+    return AddGroupCompat(info, def->group - 1, &tmp);
+}
+
+static void
+HandleCompatMapFile(XkbFile * file,
+                    XkbDescPtr xkb, unsigned merge, CompatInfo * info)
+{
+    ParseCommon *stmt;
+
+    if (merge == MergeDefault)
+        merge = MergeAugment;
+    info->name = uStringDup(file->name);
+    stmt = file->defs;
+    while (stmt)
+    {
+        switch (stmt->stmtType)
+        {
+        case StmtInclude:
+            if (!HandleIncludeCompatMap((IncludeStmt *) stmt, xkb, info,
+                                        HandleCompatMapFile))
+                info->errorCount++;
+            break;
+        case StmtInterpDef:
+            if (!HandleInterpDef((InterpDef *) stmt, xkb, merge, info))
+                info->errorCount++;
+            break;
+        case StmtGroupCompatDef:
+            if (!HandleGroupCompatDef
+                ((GroupCompatDef *) stmt, xkb, merge, info))
+                info->errorCount++;
+            break;
+        case StmtIndicatorMapDef:
+        {
+            LEDInfo *rtrn;
+            rtrn = HandleIndicatorMapDef((IndicatorMapDef *) stmt, xkb,
+                                         &info->ledDflt, info->leds, merge);
+            if (rtrn != NULL)
+                info->leds = rtrn;
+            else
+                info->errorCount++;
+        }
+            break;
+        case StmtVarDef:
+            if (!HandleInterpVar((VarDef *) stmt, xkb, info))
+                info->errorCount++;
+            break;
+        case StmtVModDef:
+            if (!HandleVModDef((VModDef *) stmt, merge, &info->vmods))
+                info->errorCount++;
+            break;
+        case StmtKeycodeDef:
+            ERROR("Interpretation files may not include other types\n");
+            ACTION("Ignoring definition of key name\n");
+            info->errorCount++;
+            break;
+        default:
+            WSGO1("Unexpected statement type %d in HandleCompatMapFile\n",
+                  stmt->stmtType);
+            break;
+        }
+        stmt = stmt->next;
+        if (info->errorCount > 10)
+        {
+#ifdef NOISY
+            ERROR("Too many errors\n");
+#endif
+            ACTION1("Abandoning compatibility map \"%s\"\n", file->topName);
+            break;
+        }
+    }
+    return;
+}
+
+static void
+CopyInterps(CompatInfo * info,
+            XkbCompatMapPtr compat, Bool needSymbol, unsigned pred)
+{
+    SymInterpInfo *si;
+
+    for (si = info->interps; si; si = (SymInterpInfo *) si->defs.next)
+    {
+        if (((si->interp.match & XkbSI_OpMask) != pred) ||
+            (needSymbol && (si->interp.sym == NoSymbol)) ||
+            ((!needSymbol) && (si->interp.sym != NoSymbol)))
+            continue;
+        if (compat->num_si >= compat->size_si)
+        {
+            WSGO("No room to merge symbol interpretations\n");
+            ACTION("Symbol interpretations lost\n");
+            return;
+        }
+        compat->sym_interpret[compat->num_si++] = si->interp;
+    }
+    return;
+}
+
+Bool
+CompileCompatMap(XkbFile * file,
+                 XkbFileInfo * result, unsigned merge, LEDInfo ** unboundLEDs)
+{
+    int i;
+    CompatInfo info;
+    XkbDescPtr xkb;
+    GroupCompatInfo *gcm;
+
+    xkb = result->xkb;
+    InitCompatInfo(&info, xkb);
+    info.dflt.defs.merge = merge;
+    info.ledDflt.defs.merge = merge;
+    HandleCompatMapFile(file, xkb, merge, &info);
+
+    if (info.errorCount == 0)
+    {
+        int size;
+        if (XkbAllocCompatMap(xkb, XkbAllCompatMask, info.nInterps) !=
+            Success)
+        {
+            WSGO("Couldn't allocate compatibility map\n");
+            ACTION("Exiting\n");
+            return False;
+        }
+        if (info.name != NULL)
+        {
+            if (XkbAllocNames(xkb, XkbCompatNameMask, 0, 0) == Success)
+                xkb->names->compat =
+                    XkbInternAtom(xkb->dpy, info.name, False);
+            else
+            {
+                WSGO("Couldn't allocate space for compat name\n");
+                ACTION2("Name \"%s\" (from %s) NOT assigned\n",
+                        scanFile, info.name);
+            }
+        }
+        size = info.nInterps * sizeof(XkbSymInterpretRec);
+        if (size > 0)
+        {
+            CopyInterps(&info, xkb->compat, True, XkbSI_Exactly);
+            CopyInterps(&info, xkb->compat, True, XkbSI_AllOf | XkbSI_NoneOf);
+            CopyInterps(&info, xkb->compat, True, XkbSI_AnyOf);
+            CopyInterps(&info, xkb->compat, True, XkbSI_AnyOfOrNone);
+            CopyInterps(&info, xkb->compat, False, XkbSI_Exactly);
+            CopyInterps(&info, xkb->compat, False,
+                        XkbSI_AllOf | XkbSI_NoneOf);
+            CopyInterps(&info, xkb->compat, False, XkbSI_AnyOf);
+            CopyInterps(&info, xkb->compat, False, XkbSI_AnyOfOrNone);
+        }
+        for (i = 0, gcm = &info.groupCompat[0]; i < XkbNumKbdGroups;
+             i++, gcm++)
+        {
+            if ((gcm->fileID != 0) || (gcm->real_mods != 0)
+                || (gcm->vmods != 0))
+            {
+                xkb->compat->groups[i].mask = gcm->real_mods;
+                xkb->compat->groups[i].real_mods = gcm->real_mods;
+                xkb->compat->groups[i].vmods = gcm->vmods;
+            }
+        }
+        if (info.leds != NULL)
+        {
+            if (!CopyIndicatorMapDefs(result, info.leds, unboundLEDs))
+                info.errorCount++;
+            info.leds = NULL;
+        }
+        ClearCompatInfo(&info, xkb);
+        return True;
+    }
+    if (info.interps != NULL)
+        uFree(info.interps);
+    return False;
+}
diff --git a/compat.h b/compat.h
new file mode 100644 (file)
index 0000000..799b215
--- /dev/null
+++ b/compat.h
@@ -0,0 +1,7 @@
+
+#ifndef COMPAT_H
+#define COMPAT_H 1
+
+extern LookupEntry groupNames[];
+
+#endif /* COMPAT_H */
diff --git a/config.guess b/config.guess
new file mode 100644 (file)
index 0000000..2852378
--- /dev/null
@@ -0,0 +1,1505 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+#   Free Software Foundation, Inc.
+
+timestamp='2010-08-21'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner.  Please send patches (context
+# diff format) to <config-patches@gnu.org> and include a ChangeLog
+# entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
+Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' HUP INT TERM
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" HUP INT PIPE TERM ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+       for c in cc gcc c89 c99 ; do
+         if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+            CC_FOR_BUILD="$c"; break ;
+         fi ;
+       done ;
+       if test x"$CC_FOR_BUILD" = x ; then
+         CC_FOR_BUILD=no_compiler_found ;
+       fi
+       ;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+       PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+       # NetBSD (nbsd) targets should (where applicable) match one or
+       # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+       # *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+       # switched to ELF, *-*-netbsd* would select the old
+       # object file format.  This provides both forward
+       # compatibility and a consistent mechanism for selecting the
+       # object file format.
+       #
+       # Note: NetBSD doesn't particularly care about the vendor
+       # portion of the name.  We always set it to "unknown".
+       sysctl="sysctl -n hw.machine_arch"
+       UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+           /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+       case "${UNAME_MACHINE_ARCH}" in
+           armeb) machine=armeb-unknown ;;
+           arm*) machine=arm-unknown ;;
+           sh3el) machine=shl-unknown ;;
+           sh3eb) machine=sh-unknown ;;
+           sh5el) machine=sh5le-unknown ;;
+           *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+       esac
+       # The Operating System including object format, if it has switched
+       # to ELF recently, or will in the future.
+       case "${UNAME_MACHINE_ARCH}" in
+           arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+               eval $set_cc_for_build
+               if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+                       | grep -q __ELF__
+               then
+                   # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+                   # Return netbsd for either.  FIX?
+                   os=netbsd
+               else
+                   os=netbsdelf
+               fi
+               ;;
+           *)
+               os=netbsd
+               ;;
+       esac
+       # The OS release
+       # Debian GNU/NetBSD machines have a different userland, and
+       # thus, need a distinct triplet. However, they do not need
+       # kernel version information, so it can be replaced with a
+       # suitable tag, in the style of linux-gnu.
+       case "${UNAME_VERSION}" in
+           Debian*)
+               release='-gnu'
+               ;;
+           *)
+               release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+               ;;
+       esac
+       # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+       # contains redundant information, the shorter form:
+       # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+       echo "${machine}-${os}${release}"
+       exit ;;
+    *:OpenBSD:*:*)
+       UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+       echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+       exit ;;
+    *:ekkoBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+       exit ;;
+    *:SolidBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+       exit ;;
+    macppc:MirBSD:*:*)
+       echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+       exit ;;
+    *:MirBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+       exit ;;
+    alpha:OSF1:*:*)
+       case $UNAME_RELEASE in
+       *4.0)
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+               ;;
+       *5.*)
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+               ;;
+       esac
+       # According to Compaq, /usr/sbin/psrinfo has been available on
+       # OSF/1 and Tru64 systems produced since 1995.  I hope that
+       # covers most systems running today.  This code pipes the CPU
+       # types through head -n 1, so we only detect the type of CPU 0.
+       ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+       case "$ALPHA_CPU_TYPE" in
+           "EV4 (21064)")
+               UNAME_MACHINE="alpha" ;;
+           "EV4.5 (21064)")
+               UNAME_MACHINE="alpha" ;;
+           "LCA4 (21066/21068)")
+               UNAME_MACHINE="alpha" ;;
+           "EV5 (21164)")
+               UNAME_MACHINE="alphaev5" ;;
+           "EV5.6 (21164A)")
+               UNAME_MACHINE="alphaev56" ;;
+           "EV5.6 (21164PC)")
+               UNAME_MACHINE="alphapca56" ;;
+           "EV5.7 (21164PC)")
+               UNAME_MACHINE="alphapca57" ;;
+           "EV6 (21264)")
+               UNAME_MACHINE="alphaev6" ;;
+           "EV6.7 (21264A)")
+               UNAME_MACHINE="alphaev67" ;;
+           "EV6.8CB (21264C)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.8AL (21264B)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.8CX (21264D)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.9A (21264/EV69A)")
+               UNAME_MACHINE="alphaev69" ;;
+           "EV7 (21364)")
+               UNAME_MACHINE="alphaev7" ;;
+           "EV7.9 (21364A)")
+               UNAME_MACHINE="alphaev79" ;;
+       esac
+       # A Pn.n version is a patched version.
+       # A Vn.n version is a released version.
+       # A Tn.n version is a released field test version.
+       # A Xn.n version is an unreleased experimental baselevel.
+       # 1.2 uses "1.2" for uname -r.
+       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+       exit ;;
+    Alpha\ *:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # Should we change UNAME_MACHINE based on the output of uname instead
+       # of the specific Alpha model?
+       echo alpha-pc-interix
+       exit ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-unknown-sysv4
+       exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-amigaos
+       exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-morphos
+       exit ;;
+    *:OS/390:*:*)
+       echo i370-ibm-openedition
+       exit ;;
+    *:z/VM:*:*)
+       echo s390-ibm-zvmoe
+       exit ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+       exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+       echo arm-unknown-riscos
+       exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+       if test "`(/bin/universe) 2>/dev/null`" = att ; then
+               echo pyramid-pyramid-sysv3
+       else
+               echo pyramid-pyramid-bsd
+       fi
+       exit ;;
+    NILE*:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit ;;
+    DRS?6000:unix:4.0:6*)
+       echo sparc-icl-nx6
+       exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+       case `/usr/bin/uname -p` in
+           sparc) echo sparc-icl-nx7; exit ;;
+       esac ;;
+    s390x:SunOS:*:*)
+       echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4H:SunOS:5.*:*)
+       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+       echo i386-pc-auroraux${UNAME_RELEASE}
+       exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+       eval $set_cc_for_build
+       SUN_ARCH="i386"
+       # If there is a compiler, see if it is configured for 64-bit objects.
+       # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+       # This test works for both compilers.
+       if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+           if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+               (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+               grep IS_64BIT_ARCH >/dev/null
+           then
+               SUN_ARCH="x86_64"
+           fi
+       fi
+       echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:*:*)
+       case "`/usr/bin/arch -k`" in
+           Series*|S4*)
+               UNAME_RELEASE=`uname -v`
+               ;;
+       esac
+       # Japanese Language versions have a version number like `4.1.3-JL'.
+       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+       exit ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit ;;
+    sun*:*:4.2BSD:*)
+       UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+       case "`/bin/arch`" in
+           sun3)
+               echo m68k-sun-sunos${UNAME_RELEASE}
+               ;;
+           sun4)
+               echo sparc-sun-sunos${UNAME_RELEASE}
+               ;;
+       esac
+       exit ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos${UNAME_RELEASE}
+       exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+       exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+        exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+       exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit ;;
+    m68k:machten:*:*)
+       echo m68k-apple-machten${UNAME_RELEASE}
+       exit ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten${UNAME_RELEASE}
+       exit ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+       echo clipper-intergraph-clix${UNAME_RELEASE}
+       exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       $CC_FOR_BUILD -o $dummy $dummy.c &&
+         dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+         SYSTEM_NAME=`$dummy $dummyarg` &&
+           { echo "$SYSTEM_NAME"; exit; }
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit ;;
+    Motorola:PowerMAX_OS:*:*)
+       echo powerpc-motorola-powermax
+       exit ;;
+    Motorola:*:4.3:PL8-*)
+       echo powerpc-harris-powermax
+       exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+       echo powerpc-harris-powermax
+       exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+       if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+       then
+           if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+              [ ${TARGET_BINARY_INTERFACE}x = x ]
+           then
+               echo m88k-dg-dgux${UNAME_RELEASE}
+           else
+               echo m88k-dg-dguxbcs${UNAME_RELEASE}
+           fi
+       else
+           echo i586-dg-dgux${UNAME_RELEASE}
+       fi
+       exit ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+       exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+       echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+       exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+       echo i386-ibm-aix
+       exit ;;
+    ia64:AIX:*:*)
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+       exit ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               eval $set_cc_for_build
+               sed 's/^                //' << EOF >$dummy.c
+               #include <sys/systemcfg.h>
+
+               main()
+                       {
+                       if (!__power_pc())
+                               exit(1);
+                       puts("powerpc-ibm-aix3.2.5");
+                       exit(0);
+                       }
+EOF
+               if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+               then
+                       echo "$SYSTEM_NAME"
+               else
+                       echo rs6000-ibm-aix3.2.5
+               fi
+       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+               echo rs6000-ibm-aix3.2.4
+       else
+               echo rs6000-ibm-aix3.2
+       fi
+       exit ;;
+    *:AIX:*:[4567])
+       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+       if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+               IBM_ARCH=rs6000
+       else
+               IBM_ARCH=powerpc
+       fi
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+       exit ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+       echo romp-ibm-bsd4.4
+       exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+       exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit ;;
+    9000/[34678]??:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       case "${UNAME_MACHINE}" in
+           9000/31? )            HP_ARCH=m68000 ;;
+           9000/[34]?? )         HP_ARCH=m68k ;;
+           9000/[678][0-9][0-9])
+               if [ -x /usr/bin/getconf ]; then
+                   sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+                         '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+               fi
+               if [ "${HP_ARCH}" = "" ]; then
+                   eval $set_cc_for_build
+                   sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+               {
+               case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+               case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+               case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+                   switch (bits)
+                       {
+                       case 64: puts ("hppa2.0w"); break;
+                       case 32: puts ("hppa2.0n"); break;
+                       default: puts ("hppa2.0"); break;
+                       } break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+                   puts ("hppa2.0"); break;
+              #endif
+               default: puts ("hppa1.0"); break;
+               }
+                  exit (0);
+              }
+EOF
+                   (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+                   test -z "$HP_ARCH" && HP_ARCH=hppa
+               fi ;;
+       esac
+       if [ ${HP_ARCH} = "hppa2.0w" ]
+       then
+           eval $set_cc_for_build
+
+           # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+           # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+           # generating 64-bit code.  GNU and HP use different nomenclature:
+           #
+           # $ CC_FOR_BUILD=cc ./config.guess
+           # => hppa2.0w-hp-hpux11.23
+           # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+           # => hppa64-hp-hpux11.23
+
+           if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+               grep -q __LP64__
+           then
+               HP_ARCH="hppa2.0w"
+           else
+               HP_ARCH="hppa64"
+           fi
+       fi
+       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+       exit ;;
+    ia64:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       echo ia64-hp-hpux${HPUX_REV}
+       exit ;;
+    3050*:HI-UX:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #include <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+            results, however.  */
+         if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+               { echo "$SYSTEM_NAME"; exit; }
+       echo unknown-hitachi-hiuxwe2
+       exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+       echo hppa1.1-hp-bsd
+       exit ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+       echo hppa1.0-hp-mpeix
+       exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+       echo hppa1.1-hp-osf
+       exit ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit ;;
+    i*86:OSF1:*:*)
+       if [ -x /usr/sbin/sysversion ] ; then
+           echo ${UNAME_MACHINE}-unknown-osf1mk
+       else
+           echo ${UNAME_MACHINE}-unknown-osf1
+       fi
+       exit ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+        exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+        exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+        exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+        exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+        exit ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*[A-Z]90:*:*:*)
+       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+             -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*T3E:*:*:*)
+       echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*SV1:*:*:*)
+       echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    *:UNICOS/mp:*:*)
+       echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+       FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+       exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+       exit ;;
+    sparc*:BSD/OS:*:*)
+       echo sparc-unknown-bsdi${UNAME_RELEASE}
+       exit ;;
+    *:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+       exit ;;
+    *:FreeBSD:*:*)
+       case ${UNAME_MACHINE} in
+           pc98)
+               echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+           amd64)
+               echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+           *)
+               echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+       esac
+       exit ;;
+    i*:CYGWIN*:*)
+       echo ${UNAME_MACHINE}-pc-cygwin
+       exit ;;
+    *:MINGW*:*)
+       echo ${UNAME_MACHINE}-pc-mingw32
+       exit ;;
+    i*:windows32*:*)
+       # uname -m includes "-pc" on this system.
+       echo ${UNAME_MACHINE}-mingw32
+       exit ;;
+    i*:PW*:*)
+       echo ${UNAME_MACHINE}-pc-pw32
+       exit ;;
+    *:Interix*:*)
+       case ${UNAME_MACHINE} in
+           x86)
+               echo i586-pc-interix${UNAME_RELEASE}
+               exit ;;
+           authenticamd | genuineintel | EM64T)
+               echo x86_64-unknown-interix${UNAME_RELEASE}
+               exit ;;
+           IA64)
+               echo ia64-unknown-interix${UNAME_RELEASE}
+               exit ;;
+       esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+       echo i${UNAME_MACHINE}-pc-mks
+       exit ;;
+    8664:Windows_NT:*)
+       echo x86_64-pc-mks
+       exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+       # UNAME_MACHINE based on the output of uname instead of i386?
+       echo i586-pc-interix
+       exit ;;
+    i*:UWIN*:*)
+       echo ${UNAME_MACHINE}-pc-uwin
+       exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+       echo x86_64-unknown-cygwin
+       exit ;;
+    p*:CYGWIN*:*)
+       echo powerpcle-unknown-cygwin
+       exit ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    *:GNU:*:*)
+       # the GNU system
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       exit ;;
+    *:GNU/*:*:*)
+       # other systems with GNU libc and userland
+       echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+       exit ;;
+    i*86:Minix:*:*)
+       echo ${UNAME_MACHINE}-pc-minix
+       exit ;;
+    alpha:Linux:*:*)
+       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+         EV5)   UNAME_MACHINE=alphaev5 ;;
+         EV56)  UNAME_MACHINE=alphaev56 ;;
+         PCA56) UNAME_MACHINE=alphapca56 ;;
+         PCA57) UNAME_MACHINE=alphapca56 ;;
+         EV6)   UNAME_MACHINE=alphaev6 ;;
+         EV67)  UNAME_MACHINE=alphaev67 ;;
+         EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+       objdump --private-headers /bin/sh | grep -q ld.so.1
+       if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+       echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+       exit ;;
+    arm*:Linux:*:*)
+       eval $set_cc_for_build
+       if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+           | grep -q __ARM_EABI__
+       then
+           echo ${UNAME_MACHINE}-unknown-linux-gnu
+       else
+           echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+       fi
+       exit ;;
+    avr32*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    cris:Linux:*:*)
+       echo cris-axis-linux-gnu
+       exit ;;
+    crisv32:Linux:*:*)
+       echo crisv32-axis-linux-gnu
+       exit ;;
+    frv:Linux:*:*)
+       echo frv-unknown-linux-gnu
+       exit ;;
+    i*86:Linux:*:*)
+       LIBC=gnu
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #ifdef __dietlibc__
+       LIBC=dietlibc
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+       echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+       exit ;;
+    ia64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    m32r*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    m68*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #undef CPU
+       #undef ${UNAME_MACHINE}
+       #undef ${UNAME_MACHINE}el
+       #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+       CPU=${UNAME_MACHINE}el
+       #else
+       #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+       CPU=${UNAME_MACHINE}
+       #else
+       CPU=
+       #endif
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+       test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+       ;;
+    or32:Linux:*:*)
+       echo or32-unknown-linux-gnu
+       exit ;;
+    padre:Linux:*:*)
+       echo sparc-unknown-linux-gnu
+       exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+       echo hppa64-unknown-linux-gnu
+       exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+       # Look for CPU level
+       case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+         PA7*) echo hppa1.1-unknown-linux-gnu ;;
+         PA8*) echo hppa2.0-unknown-linux-gnu ;;
+         *)    echo hppa-unknown-linux-gnu ;;
+       esac
+       exit ;;
+    ppc64:Linux:*:*)
+       echo powerpc64-unknown-linux-gnu
+       exit ;;
+    ppc:Linux:*:*)
+       echo powerpc-unknown-linux-gnu
+       exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+       echo ${UNAME_MACHINE}-ibm-linux
+       exit ;;
+    sh64*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    sh*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    tile*:Linux:*:*)
+       echo ${UNAME_MACHINE}-tilera-linux-gnu
+       exit ;;
+    vax:Linux:*:*)
+       echo ${UNAME_MACHINE}-dec-linux-gnu
+       exit ;;
+    x86_64:Linux:*:*)
+       echo x86_64-unknown-linux-gnu
+       exit ;;
+    xtensa*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    i*86:DYNIX/ptx:4*:*)
+       # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+       # earlier versions are messed up and put the nodename in both
+       # sysname and nodename.
+       echo i386-sequent-sysv4
+       exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+       # I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+       echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+       exit ;;
+    i*86:OS/2:*:*)
+       # If we were able to find `uname', then EMX Unix compatibility
+       # is probably installed.
+       echo ${UNAME_MACHINE}-pc-os2-emx
+       exit ;;
+    i*86:XTS-300:*:STOP)
+       echo ${UNAME_MACHINE}-unknown-stop
+       exit ;;
+    i*86:atheos:*:*)
+       echo ${UNAME_MACHINE}-unknown-atheos
+       exit ;;
+    i*86:syllable:*:*)
+       echo ${UNAME_MACHINE}-pc-syllable
+       exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+       echo i386-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    i*86:*DOS:*:*)
+       echo ${UNAME_MACHINE}-pc-msdosdjgpp
+       exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+       UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+               echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+       else
+               echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+       fi
+       exit ;;
+    i*86:*:5:[678]*)
+       # UnixWare 7.x, OpenUNIX and OpenServer 6.
+       case `/bin/uname -X | grep "^Machine"` in
+           *486*)           UNAME_MACHINE=i486 ;;
+           *Pentium)        UNAME_MACHINE=i586 ;;
+           *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+       esac
+       echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+       exit ;;
+    i*86:*:3.2:*)
+       if test -f /usr/options/cb.name; then
+               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+       elif /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+       else
+               echo ${UNAME_MACHINE}-pc-sysv32
+       fi
+       exit ;;
+    pc:*:*:*)
+       # Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i586.
+       # Note: whatever this is, it MUST be the same as what config.sub
+       # prints for the "djgpp" host, or else GDB configury will decide that
+       # this is a cross-build.
+       echo i586-pc-msdosdjgpp
+        exit ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit ;;
+    i860:*:4.*:*) # i860-SVR4
+       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+       else # Add other i860-SVR4 vendors below as they are discovered.
+         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+       fi
+       exit ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+       echo m68k-convergent-sysv
+       exit ;;
+    M680?0:D-NIX:5.3:*)
+       echo m68k-diab-dnix
+       exit ;;
+    M68*:*:R3V[5678]*:*)
+       test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+       OS_REL=''
+       test -r /etc/.relid \
+       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+       OS_REL='.3'
+       test -r /etc/.relid \
+           && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+           && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+           && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+           && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+       echo m68k-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    rs6000:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+       echo powerpc-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv${UNAME_RELEASE}
+       exit ;;
+    RM*:ReliantUNIX-*:*:*)
+       echo mips-sni-sysv4
+       exit ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit ;;
+    *:SINIX-*:*:*)
+       if uname -p 2>/dev/null >/dev/null ; then
+               UNAME_MACHINE=`(uname -p) 2>/dev/null`
+               echo ${UNAME_MACHINE}-sni-sysv4
+       else
+               echo ns32k-sni-sysv
+       fi
+       exit ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit ;;
+    i*86:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo ${UNAME_MACHINE}-stratus-vos
+       exit ;;
+    *:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo hppa1.1-stratus-vos
+       exit ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux${UNAME_RELEASE}
+       exit ;;
+    news*:NEWS-OS:6*:*)
+       echo mips-sony-newsos6
+       exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+       if [ -d /usr/nec ]; then
+               echo mips-nec-sysv${UNAME_RELEASE}
+       else
+               echo mips-unknown-sysv${UNAME_RELEASE}
+       fi
+        exit ;;
+    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
+       echo powerpc-be-beos
+       exit ;;
+    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
+       echo powerpc-apple-beos
+       exit ;;
+    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
+       echo i586-pc-beos
+       exit ;;
+    BePC:Haiku:*:*)    # Haiku running on Intel PC compatible.
+       echo i586-pc-haiku
+       exit ;;
+    SX-4:SUPER-UX:*:*)
+       echo sx4-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-5:SUPER-UX:*:*)
+       echo sx5-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-6:SUPER-UX:*:*)
+       echo sx6-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-7:SUPER-UX:*:*)
+       echo sx7-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-8:SUPER-UX:*:*)
+       echo sx8-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-8R:SUPER-UX:*:*)
+       echo sx8r-nec-superux${UNAME_RELEASE}
+       exit ;;
+    Power*:Rhapsody:*:*)
+       echo powerpc-apple-rhapsody${UNAME_RELEASE}
+       exit ;;
+    *:Rhapsody:*:*)
+       echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+       exit ;;
+    *:Darwin:*:*)
+       UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+       case $UNAME_PROCESSOR in
+           i386)
+               eval $set_cc_for_build
+               if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+                 if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+                     (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+                     grep IS_64BIT_ARCH >/dev/null
+                 then
+                     UNAME_PROCESSOR="x86_64"
+                 fi
+               fi ;;
+           unknown) UNAME_PROCESSOR=powerpc ;;
+       esac
+       echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+       exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+       UNAME_PROCESSOR=`uname -p`
+       if test "$UNAME_PROCESSOR" = "x86"; then
+               UNAME_PROCESSOR=i386
+               UNAME_MACHINE=pc
+       fi
+       echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+       exit ;;
+    *:QNX:*:4*)
+       echo i386-pc-qnx
+       exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+       echo nse-tandem-nsk${UNAME_RELEASE}
+       exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+       echo nsr-tandem-nsk${UNAME_RELEASE}
+       exit ;;
+    *:NonStop-UX:*:*)
+       echo mips-compaq-nonstopux
+       exit ;;
+    BS2000:POSIX*:*:*)
+       echo bs2000-siemens-sysv
+       exit ;;
+    DS/*:UNIX_System_V:*:*)
+       echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+       exit ;;
+    *:Plan9:*:*)
+       # "uname -m" is not consistent, so use $cputype instead. 386
+       # is converted to i386 for consistency with other x86
+       # operating systems.
+       if test "$cputype" = "386"; then
+           UNAME_MACHINE=i386
+       else
+           UNAME_MACHINE="$cputype"
+       fi
+       echo ${UNAME_MACHINE}-unknown-plan9
+       exit ;;
+    *:TOPS-10:*:*)
+       echo pdp10-unknown-tops10
+       exit ;;
+    *:TENEX:*:*)
+       echo pdp10-unknown-tenex
+       exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+       echo pdp10-dec-tops20
+       exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+       echo pdp10-xkl-tops20
+       exit ;;
+    *:TOPS-20:*:*)
+       echo pdp10-unknown-tops20
+       exit ;;
+    *:ITS:*:*)
+       echo pdp10-unknown-its
+       exit ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+       exit ;;
+    *:DragonFly:*:*)
+       echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+       exit ;;
+    *:*VMS:*:*)
+       UNAME_MACHINE=`(uname -p) 2>/dev/null`
+       case "${UNAME_MACHINE}" in
+           A*) echo alpha-dec-vms ; exit ;;
+           I*) echo ia64-dec-vms ; exit ;;
+           V*) echo vax-dec-vms ; exit ;;
+       esac ;;
+    *:XENIX:*:SysV)
+       echo i386-pc-xenix
+       exit ;;
+    i*86:skyos:*:*)
+       echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+       exit ;;
+    i*86:rdos:*:*)
+       echo ${UNAME_MACHINE}-pc-rdos
+       exit ;;
+    i*86:AROS:*:*)
+       echo ${UNAME_MACHINE}-pc-aros
+       exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+         ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+       printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+       printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+       { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+       echo c1-convex-bsd
+       exit ;;
+    c2*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit ;;
+    c34*)
+       echo c34-convex-bsd
+       exit ;;
+    c38*)
+       echo c38-convex-bsd
+       exit ;;
+    c4*)
+       echo c4-convex-bsd
+       exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config.h.in b/config.h.in
new file mode 100644 (file)
index 0000000..d60fda1
--- /dev/null
@@ -0,0 +1,70 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#undef HAVE_STRCASECMP
+
+/* Define to 1 if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Major version of this package */
+#undef PACKAGE_VERSION_MAJOR
+
+/* Minor version of this package */
+#undef PACKAGE_VERSION_MINOR
+
+/* Patch version of this package */
+#undef PACKAGE_VERSION_PATCHLEVEL
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
diff --git a/config.sub b/config.sub
new file mode 100644 (file)
index 0000000..320e303
--- /dev/null
@@ -0,0 +1,1739 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+#   Free Software Foundation, Inc.
+
+timestamp='2010-09-11'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted GNU ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
+Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+       -sun*os*)
+               # Prevent following clause from handling this invalid input.
+               ;;
+       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+       -apple | -axis | -knuth | -cray | -microblaze)
+               os=
+               basic_machine=$1
+               ;;
+        -bluegene*)
+               os=-cnk
+               ;;
+       -sim | -cisco | -oki | -wec | -winbond)
+               os=
+               basic_machine=$1
+               ;;
+       -scout)
+               ;;
+       -wrs)
+               os=-vxworks
+               basic_machine=$1
+               ;;
+       -chorusos*)
+               os=-chorusos
+               basic_machine=$1
+               ;;
+       -chorusrdb)
+               os=-chorusrdb
+               basic_machine=$1
+               ;;
+       -hiux*)
+               os=-hiuxwe2
+               ;;
+       -sco6)
+               os=-sco5v6
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco5)
+               os=-sco3.2v5
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco4)
+               os=-sco3.2v4
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2.[4-9]*)
+               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2v[4-9]*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco5v6*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco*)
+               os=-sco3.2v2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -udk*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -isc)
+               os=-isc2.2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -clix*)
+               basic_machine=clipper-intergraph
+               ;;
+       -isc*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -lynx*)
+               os=-lynxos
+               ;;
+       -ptx*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+               ;;
+       -windowsnt*)
+               os=`echo $os | sed -e 's/windowsnt/winnt/'`
+               ;;
+       -psos*)
+               os=-psos
+               ;;
+       -mint | -mint[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+       # Recognize the basic CPU types without company name.
+       # Some are omitted here because they have special meanings below.
+       1750a | 580 \
+       | a29k \
+       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+       | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+       | am33_2.0 \
+       | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+       | bfin \
+       | c4x | clipper \
+       | d10v | d30v | dlx | dsp16xx \
+       | fido | fr30 | frv \
+       | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+       | i370 | i860 | i960 | ia64 \
+       | ip2k | iq2000 \
+       | lm32 \
+       | m32c | m32r | m32rle | m68000 | m68k | m88k \
+       | maxq | mb | microblaze | mcore | mep | metag \
+       | mips | mipsbe | mipseb | mipsel | mipsle \
+       | mips16 \
+       | mips64 | mips64el \
+       | mips64octeon | mips64octeonel \
+       | mips64orion | mips64orionel \
+       | mips64r5900 | mips64r5900el \
+       | mips64vr | mips64vrel \
+       | mips64vr4100 | mips64vr4100el \
+       | mips64vr4300 | mips64vr4300el \
+       | mips64vr5000 | mips64vr5000el \
+       | mips64vr5900 | mips64vr5900el \
+       | mipsisa32 | mipsisa32el \
+       | mipsisa32r2 | mipsisa32r2el \
+       | mipsisa64 | mipsisa64el \
+       | mipsisa64r2 | mipsisa64r2el \
+       | mipsisa64sb1 | mipsisa64sb1el \
+       | mipsisa64sr71k | mipsisa64sr71kel \
+       | mipstx39 | mipstx39el \
+       | mn10200 | mn10300 \
+       | moxie \
+       | mt \
+       | msp430 \
+       | nds32 | nds32le | nds32be \
+       | nios | nios2 \
+       | ns16k | ns32k \
+       | or32 \
+       | pdp10 | pdp11 | pj | pjl \
+       | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+       | pyramid \
+       | rx \
+       | score \
+       | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+       | sh64 | sh64le \
+       | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+       | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+       | spu | strongarm \
+       | tahoe | thumb | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+       | ubicom32 \
+       | v850 | v850e \
+       | we32k \
+       | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+       | z8k | z80)
+               basic_machine=$basic_machine-unknown
+               ;;
+       c54x)
+               basic_machine=tic54x-unknown
+               ;;
+       c55x)
+               basic_machine=tic55x-unknown
+               ;;
+       c6x)
+               basic_machine=tic6x-unknown
+               ;;
+       m6811 | m68hc11 | m6812 | m68hc12 | picochip)
+               # Motorola 68HC11/12.
+               basic_machine=$basic_machine-unknown
+               os=-none
+               ;;
+       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+               ;;
+       ms1)
+               basic_machine=mt-unknown
+               ;;
+
+       # We use `pc' rather than `unknown'
+       # because (1) that's what they normally are, and
+       # (2) the word "unknown" tends to confuse beginning users.
+       i*86 | x86_64)
+         basic_machine=$basic_machine-pc
+         ;;
+       # Object if more than one company name word.
+       *-*-*)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+       # Recognize the basic CPU types with company name.
+       580-* \
+       | a29k-* \
+       | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+       | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+       | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+       | arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+       | avr-* | avr32-* \
+       | bfin-* | bs2000-* \
+       | c[123]* | c30-* | [cjt]90-* | c4x-* \
+       | clipper-* | craynv-* | cydra-* \
+       | d10v-* | d30v-* | dlx-* \
+       | elxsi-* \
+       | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+       | h8300-* | h8500-* \
+       | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+       | i*86-* | i860-* | i960-* | ia64-* \
+       | ip2k-* | iq2000-* \
+       | lm32-* \
+       | m32c-* | m32r-* | m32rle-* \
+       | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+       | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+       | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+       | mips16-* \
+       | mips64-* | mips64el-* \
+       | mips64octeon-* | mips64octeonel-* \
+       | mips64orion-* | mips64orionel-* \
+       | mips64r5900-* | mips64r5900el-* \
+       | mips64vr-* | mips64vrel-* \
+       | mips64vr4100-* | mips64vr4100el-* \
+       | mips64vr4300-* | mips64vr4300el-* \
+       | mips64vr5000-* | mips64vr5000el-* \
+       | mips64vr5900-* | mips64vr5900el-* \
+       | mipsisa32-* | mipsisa32el-* \
+       | mipsisa32r2-* | mipsisa32r2el-* \
+       | mipsisa64-* | mipsisa64el-* \
+       | mipsisa64r2-* | mipsisa64r2el-* \
+       | mipsisa64sb1-* | mipsisa64sb1el-* \
+       | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+       | mipstx39-* | mipstx39el-* \
+       | mmix-* \
+       | mt-* \
+       | msp430-* \
+       | nds32-* | nds32le-* | nds32be-* \
+       | nios-* | nios2-* \
+       | none-* | np1-* | ns16k-* | ns32k-* \
+       | orion-* \
+       | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+       | pyramid-* \
+       | romp-* | rs6000-* | rx-* \
+       | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+       | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+       | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+       | sparclite-* \
+       | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+       | tahoe-* | thumb-* \
+       | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+       | tile-* | tilegx-* \
+       | tron-* \
+       | ubicom32-* \
+       | v850-* | v850e-* | vax-* \
+       | we32k-* \
+       | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+       | xstormy16-* | xtensa*-* \
+       | ymp-* \
+       | z8k-* | z80-*)
+               ;;
+       # Recognize the basic CPU types without company name, with glob match.
+       xtensa*)
+               basic_machine=$basic_machine-unknown
+               ;;
+       # Recognize the various machine names and aliases which stand
+       # for a CPU type and a company and sometimes even an OS.
+       386bsd)
+               basic_machine=i386-unknown
+               os=-bsd
+               ;;
+       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+               basic_machine=m68000-att
+               ;;
+       3b*)
+               basic_machine=we32k-att
+               ;;
+       a29khif)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       abacus)
+               basic_machine=abacus-unknown
+               ;;
+       adobe68k)
+               basic_machine=m68010-adobe
+               os=-scout
+               ;;
+       alliant | fx80)
+               basic_machine=fx80-alliant
+               ;;
+       altos | altos3068)
+               basic_machine=m68k-altos
+               ;;
+       am29k)
+               basic_machine=a29k-none
+               os=-bsd
+               ;;
+       amd64)
+               basic_machine=x86_64-pc
+               ;;
+       amd64-*)
+               basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       amdahl)
+               basic_machine=580-amdahl
+               os=-sysv
+               ;;
+       amiga | amiga-*)
+               basic_machine=m68k-unknown
+               ;;
+       amigaos | amigados)
+               basic_machine=m68k-unknown
+               os=-amigaos
+               ;;
+       amigaunix | amix)
+               basic_machine=m68k-unknown
+               os=-sysv4
+               ;;
+       apollo68)
+               basic_machine=m68k-apollo
+               os=-sysv
+               ;;
+       apollo68bsd)
+               basic_machine=m68k-apollo
+               os=-bsd
+               ;;
+       aros)
+               basic_machine=i386-pc
+               os=-aros
+               ;;
+       aux)
+               basic_machine=m68k-apple
+               os=-aux
+               ;;
+       balance)
+               basic_machine=ns32k-sequent
+               os=-dynix
+               ;;
+       blackfin)
+               basic_machine=bfin-unknown
+               os=-linux
+               ;;
+       blackfin-*)
+               basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+               os=-linux
+               ;;
+       bluegene*)
+               basic_machine=powerpc-ibm
+               os=-cnk
+               ;;
+       c54x-*)
+               basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       c55x-*)
+               basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       c6x-*)
+               basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       c90)
+               basic_machine=c90-cray
+               os=-unicos
+               ;;
+        cegcc)
+               basic_machine=arm-unknown
+               os=-cegcc
+               ;;
+       convex-c1)
+               basic_machine=c1-convex
+               os=-bsd
+               ;;
+       convex-c2)
+               basic_machine=c2-convex
+               os=-bsd
+               ;;
+       convex-c32)
+               basic_machine=c32-convex
+               os=-bsd
+               ;;
+       convex-c34)
+               basic_machine=c34-convex
+               os=-bsd
+               ;;
+       convex-c38)
+               basic_machine=c38-convex
+               os=-bsd
+               ;;
+       cray | j90)
+               basic_machine=j90-cray
+               os=-unicos
+               ;;
+       craynv)
+               basic_machine=craynv-cray
+               os=-unicosmp
+               ;;
+       cr16)
+               basic_machine=cr16-unknown
+               os=-elf
+               ;;
+       crds | unos)
+               basic_machine=m68k-crds
+               ;;
+       crisv32 | crisv32-* | etraxfs*)
+               basic_machine=crisv32-axis
+               ;;
+       cris | cris-* | etrax*)
+               basic_machine=cris-axis
+               ;;
+       crx)
+               basic_machine=crx-unknown
+               os=-elf
+               ;;
+       da30 | da30-*)
+               basic_machine=m68k-da30
+               ;;
+       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+               basic_machine=mips-dec
+               ;;
+       decsystem10* | dec10*)
+               basic_machine=pdp10-dec
+               os=-tops10
+               ;;
+       decsystem20* | dec20*)
+               basic_machine=pdp10-dec
+               os=-tops20
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               basic_machine=m68k-motorola
+               ;;
+       delta88)
+               basic_machine=m88k-motorola
+               os=-sysv3
+               ;;
+       dicos)
+               basic_machine=i686-pc
+               os=-dicos
+               ;;
+       djgpp)
+               basic_machine=i586-pc
+               os=-msdosdjgpp
+               ;;
+       dpx20 | dpx20-*)
+               basic_machine=rs6000-bull
+               os=-bosx
+               ;;
+       dpx2* | dpx2*-bull)
+               basic_machine=m68k-bull
+               os=-sysv3
+               ;;
+       ebmon29k)
+               basic_machine=a29k-amd
+               os=-ebmon
+               ;;
+       elxsi)
+               basic_machine=elxsi-elxsi
+               os=-bsd
+               ;;
+       encore | umax | mmax)
+               basic_machine=ns32k-encore
+               ;;
+       es1800 | OSE68k | ose68k | ose | OSE)
+               basic_machine=m68k-ericsson
+               os=-ose
+               ;;
+       fx2800)
+               basic_machine=i860-alliant
+               ;;
+       genix)
+               basic_machine=ns32k-ns
+               ;;
+       gmicro)
+               basic_machine=tron-gmicro
+               os=-sysv
+               ;;
+       go32)
+               basic_machine=i386-pc
+               os=-go32
+               ;;
+       h3050r* | hiux*)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       h8300hms)
+               basic_machine=h8300-hitachi
+               os=-hms
+               ;;
+       h8300xray)
+               basic_machine=h8300-hitachi
+               os=-xray
+               ;;
+       h8500hms)
+               basic_machine=h8500-hitachi
+               os=-hms
+               ;;
+       harris)
+               basic_machine=m88k-harris
+               os=-sysv3
+               ;;
+       hp300-*)
+               basic_machine=m68k-hp
+               ;;
+       hp300bsd)
+               basic_machine=m68k-hp
+               os=-bsd
+               ;;
+       hp300hpux)
+               basic_machine=m68k-hp
+               os=-hpux
+               ;;
+       hp3k9[0-9][0-9] | hp9[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k2[0-9][0-9] | hp9k31[0-9])
+               basic_machine=m68000-hp
+               ;;
+       hp9k3[2-9][0-9])
+               basic_machine=m68k-hp
+               ;;
+       hp9k6[0-9][0-9] | hp6[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k7[0-79][0-9] | hp7[0-79][0-9])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k78[0-9] | hp78[0-9])
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][13679] | hp8[0-9][13679])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][0-9] | hp8[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hppa-next)
+               os=-nextstep3
+               ;;
+       hppaosf)
+               basic_machine=hppa1.1-hp
+               os=-osf
+               ;;
+       hppro)
+               basic_machine=hppa1.1-hp
+               os=-proelf
+               ;;
+       i370-ibm* | ibm*)
+               basic_machine=i370-ibm
+               ;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+       i*86v32)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv32
+               ;;
+       i*86v4*)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv4
+               ;;
+       i*86v)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv
+               ;;
+       i*86sol2)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-solaris2
+               ;;
+       i386mach)
+               basic_machine=i386-mach
+               os=-mach
+               ;;
+       i386-vsta | vsta)
+               basic_machine=i386-unknown
+               os=-vsta
+               ;;
+       iris | iris4d)
+               basic_machine=mips-sgi
+               case $os in
+                   -irix*)
+                       ;;
+                   *)
+                       os=-irix4
+                       ;;
+               esac
+               ;;
+       isi68 | isi)
+               basic_machine=m68k-isi
+               os=-sysv
+               ;;
+       m68knommu)
+               basic_machine=m68k-unknown
+               os=-linux
+               ;;
+       m68knommu-*)
+               basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+               os=-linux
+               ;;
+       m88k-omron*)
+               basic_machine=m88k-omron
+               ;;
+       magnum | m3230)
+               basic_machine=mips-mips
+               os=-sysv
+               ;;
+       merlin)
+               basic_machine=ns32k-utek
+               os=-sysv
+               ;;
+        microblaze)
+               basic_machine=microblaze-xilinx
+               ;;
+       mingw32)
+               basic_machine=i386-pc
+               os=-mingw32
+               ;;
+       mingw32ce)
+               basic_machine=arm-unknown
+               os=-mingw32ce
+               ;;
+       miniframe)
+               basic_machine=m68000-convergent
+               ;;
+       *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+       mips3*-*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+               ;;
+       mips3*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+               ;;
+       monitor)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       morphos)
+               basic_machine=powerpc-unknown
+               os=-morphos
+               ;;
+       msdos)
+               basic_machine=i386-pc
+               os=-msdos
+               ;;
+       ms1-*)
+               basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+               ;;
+       mvs)
+               basic_machine=i370-ibm
+               os=-mvs
+               ;;
+       ncr3000)
+               basic_machine=i486-ncr
+               os=-sysv4
+               ;;
+       netbsd386)
+               basic_machine=i386-unknown
+               os=-netbsd
+               ;;
+       netwinder)
+               basic_machine=armv4l-rebel
+               os=-linux
+               ;;
+       news | news700 | news800 | news900)
+               basic_machine=m68k-sony
+               os=-newsos
+               ;;
+       news1000)
+               basic_machine=m68030-sony
+               os=-newsos
+               ;;
+       news-3600 | risc-news)
+               basic_machine=mips-sony
+               os=-newsos
+               ;;
+       necv70)
+               basic_machine=v70-nec
+               os=-sysv
+               ;;
+       next | m*-next )
+               basic_machine=m68k-next
+               case $os in
+                   -nextstep* )
+                       ;;
+                   -ns2*)
+                     os=-nextstep2
+                       ;;
+                   *)
+                     os=-nextstep3
+                       ;;
+               esac
+               ;;
+       nh3000)
+               basic_machine=m68k-harris
+               os=-cxux
+               ;;
+       nh[45]000)
+               basic_machine=m88k-harris
+               os=-cxux
+               ;;
+       nindy960)
+               basic_machine=i960-intel
+               os=-nindy
+               ;;
+       mon960)
+               basic_machine=i960-intel
+               os=-mon960
+               ;;
+       nonstopux)
+               basic_machine=mips-compaq
+               os=-nonstopux
+               ;;
+       np1)
+               basic_machine=np1-gould
+               ;;
+        neo-tandem)
+               basic_machine=neo-tandem
+               ;;
+        nse-tandem)
+               basic_machine=nse-tandem
+               ;;
+       nsr-tandem)
+               basic_machine=nsr-tandem
+               ;;
+       op50n-* | op60c-*)
+               basic_machine=hppa1.1-oki
+               os=-proelf
+               ;;
+       openrisc | openrisc-*)
+               basic_machine=or32-unknown
+               ;;
+       os400)
+               basic_machine=powerpc-ibm
+               os=-os400
+               ;;
+       OSE68000 | ose68000)
+               basic_machine=m68000-ericsson
+               os=-ose
+               ;;
+       os68k)
+               basic_machine=m68k-none
+               os=-os68k
+               ;;
+       pa-hitachi)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       paragon)
+               basic_machine=i860-intel
+               os=-osf
+               ;;
+       parisc)
+               basic_machine=hppa-unknown
+               os=-linux
+               ;;
+       parisc-*)
+               basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+               os=-linux
+               ;;
+       pbd)
+               basic_machine=sparc-tti
+               ;;
+       pbb)
+               basic_machine=m68k-tti
+               ;;
+       pc532 | pc532-*)
+               basic_machine=ns32k-pc532
+               ;;
+       pc98)
+               basic_machine=i386-pc
+               ;;
+       pc98-*)
+               basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentium | p5 | k5 | k6 | nexgen | viac3)
+               basic_machine=i586-pc
+               ;;
+       pentiumpro | p6 | 6x86 | athlon | athlon_*)
+               basic_machine=i686-pc
+               ;;
+       pentiumii | pentium2 | pentiumiii | pentium3)
+               basic_machine=i686-pc
+               ;;
+       pentium4)
+               basic_machine=i786-pc
+               ;;
+       pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumpro-* | p6-* | 6x86-* | athlon-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentium4-*)
+               basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pn)
+               basic_machine=pn-gould
+               ;;
+       power)  basic_machine=power-ibm
+               ;;
+       ppc)    basic_machine=powerpc-unknown
+               ;;
+       ppc-*)  basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppcle | powerpclittle | ppc-le | powerpc-little)
+               basic_machine=powerpcle-unknown
+               ;;
+       ppcle-* | powerpclittle-*)
+               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64)  basic_machine=powerpc64-unknown
+               ;;
+       ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+               basic_machine=powerpc64le-unknown
+               ;;
+       ppc64le-* | powerpc64little-*)
+               basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ps2)
+               basic_machine=i386-ibm
+               ;;
+       pw32)
+               basic_machine=i586-unknown
+               os=-pw32
+               ;;
+       rdos)
+               basic_machine=i386-pc
+               os=-rdos
+               ;;
+       rom68k)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       rm[46]00)
+               basic_machine=mips-siemens
+               ;;
+       rtpc | rtpc-*)
+               basic_machine=romp-ibm
+               ;;
+       s390 | s390-*)
+               basic_machine=s390-ibm
+               ;;
+       s390x | s390x-*)
+               basic_machine=s390x-ibm
+               ;;
+       sa29200)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       sb1)
+               basic_machine=mipsisa64sb1-unknown
+               ;;
+       sb1el)
+               basic_machine=mipsisa64sb1el-unknown
+               ;;
+       sde)
+               basic_machine=mipsisa32-sde
+               os=-elf
+               ;;
+       sei)
+               basic_machine=mips-sei
+               os=-seiux
+               ;;
+       sequent)
+               basic_machine=i386-sequent
+               ;;
+       sh)
+               basic_machine=sh-hitachi
+               os=-hms
+               ;;
+       sh5el)
+               basic_machine=sh5le-unknown
+               ;;
+       sh64)
+               basic_machine=sh64-unknown
+               ;;
+       sparclite-wrs | simso-wrs)
+               basic_machine=sparclite-wrs
+               os=-vxworks
+               ;;
+       sps7)
+               basic_machine=m68k-bull
+               os=-sysv2
+               ;;
+       spur)
+               basic_machine=spur-unknown
+               ;;
+       st2000)
+               basic_machine=m68k-tandem
+               ;;
+       stratus)
+               basic_machine=i860-stratus
+               os=-sysv4
+               ;;
+       sun2)
+               basic_machine=m68000-sun
+               ;;
+       sun2os3)
+               basic_machine=m68000-sun
+               os=-sunos3
+               ;;
+       sun2os4)
+               basic_machine=m68000-sun
+               os=-sunos4
+               ;;
+       sun3os3)
+               basic_machine=m68k-sun
+               os=-sunos3
+               ;;
+       sun3os4)
+               basic_machine=m68k-sun
+               os=-sunos4
+               ;;
+       sun4os3)
+               basic_machine=sparc-sun
+               os=-sunos3
+               ;;
+       sun4os4)
+               basic_machine=sparc-sun
+               os=-sunos4
+               ;;
+       sun4sol2)
+               basic_machine=sparc-sun
+               os=-solaris2
+               ;;
+       sun3 | sun3-*)
+               basic_machine=m68k-sun
+               ;;
+       sun4)
+               basic_machine=sparc-sun
+               ;;
+       sun386 | sun386i | roadrunner)
+               basic_machine=i386-sun
+               ;;
+       sv1)
+               basic_machine=sv1-cray
+               os=-unicos
+               ;;
+       symmetry)
+               basic_machine=i386-sequent
+               os=-dynix
+               ;;
+       t3e)
+               basic_machine=alphaev5-cray
+               os=-unicos
+               ;;
+       t90)
+               basic_machine=t90-cray
+               os=-unicos
+               ;;
+        # This must be matched before tile*.
+        tilegx*)
+               basic_machine=tilegx-unknown
+               os=-linux-gnu
+               ;;
+       tile*)
+               basic_machine=tile-unknown
+               os=-linux-gnu
+               ;;
+       tx39)
+               basic_machine=mipstx39-unknown
+               ;;
+       tx39el)
+               basic_machine=mipstx39el-unknown
+               ;;
+       toad1)
+               basic_machine=pdp10-xkl
+               os=-tops20
+               ;;
+       tower | tower-32)
+               basic_machine=m68k-ncr
+               ;;
+       tpf)
+               basic_machine=s390x-ibm
+               os=-tpf
+               ;;
+       udi29k)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       ultra3)
+               basic_machine=a29k-nyu
+               os=-sym1
+               ;;
+       v810 | necv810)
+               basic_machine=v810-nec
+               os=-none
+               ;;
+       vaxv)
+               basic_machine=vax-dec
+               os=-sysv
+               ;;
+       vms)
+               basic_machine=vax-dec
+               os=-vms
+               ;;
+       vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+       vxworks960)
+               basic_machine=i960-wrs
+               os=-vxworks
+               ;;
+       vxworks68)
+               basic_machine=m68k-wrs
+               os=-vxworks
+               ;;
+       vxworks29k)
+               basic_machine=a29k-wrs
+               os=-vxworks
+               ;;
+       w65*)
+               basic_machine=w65-wdc
+               os=-none
+               ;;
+       w89k-*)
+               basic_machine=hppa1.1-winbond
+               os=-proelf
+               ;;
+       xbox)
+               basic_machine=i686-pc
+               os=-mingw32
+               ;;
+       xps | xps100)
+               basic_machine=xps100-honeywell
+               ;;
+       ymp)
+               basic_machine=ymp-cray
+               os=-unicos
+               ;;
+       z8k-*-coff)
+               basic_machine=z8k-unknown
+               os=-sim
+               ;;
+       z80-*-coff)
+               basic_machine=z80-unknown
+               os=-sim
+               ;;
+       none)
+               basic_machine=none-none
+               os=-none
+               ;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+       w89k)
+               basic_machine=hppa1.1-winbond
+               ;;
+       op50n)
+               basic_machine=hppa1.1-oki
+               ;;
+       op60c)
+               basic_machine=hppa1.1-oki
+               ;;
+       romp)
+               basic_machine=romp-ibm
+               ;;
+       mmix)
+               basic_machine=mmix-knuth
+               ;;
+       rs6000)
+               basic_machine=rs6000-ibm
+               ;;
+       vax)
+               basic_machine=vax-dec
+               ;;
+       pdp10)
+               # there are many clones, so DEC is not a safe bet
+               basic_machine=pdp10-unknown
+               ;;
+       pdp11)
+               basic_machine=pdp11-dec
+               ;;
+       we32k)
+               basic_machine=we32k-att
+               ;;
+       sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+               basic_machine=sh-unknown
+               ;;
+       sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+               basic_machine=sparc-sun
+               ;;
+       cydra)
+               basic_machine=cydra-cydrome
+               ;;
+       orion)
+               basic_machine=orion-highlevel
+               ;;
+       orion105)
+               basic_machine=clipper-highlevel
+               ;;
+       mac | mpw | mac-mpw)
+               basic_machine=m68k-apple
+               ;;
+       pmac | pmac-mpw)
+               basic_machine=powerpc-apple
+               ;;
+       *-unknown)
+               # Make sure to match an already-canonicalized machine name.
+               ;;
+       *)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+       *-digital*)
+               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+               ;;
+       *-commodore*)
+               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+               ;;
+       *)
+               ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+       # -solaris* is a basic system type, with this one exception.
+        -auroraux)
+               os=-auroraux
+               ;;
+       -solaris1 | -solaris1.*)
+               os=`echo $os | sed -e 's|solaris1|sunos4|'`
+               ;;
+       -solaris)
+               os=-solaris2
+               ;;
+       -svr4*)
+               os=-sysv4
+               ;;
+       -unixware*)
+               os=-sysv4.2uw
+               ;;
+       -gnu/linux*)
+               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+               ;;
+       # First accept the basic system types.
+       # The portable systems comes first.
+       # Each alternative MUST END IN A *, to match a version number.
+       # -sysv* is not here because it comes later, after sysvr4.
+       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+             | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+             | -sym* | -kopensolaris* \
+             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+             | -aos* | -aros* \
+             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+             | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+             | -openbsd* | -solidbsd* \
+             | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+             | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -chorusos* | -chorusrdb* | -cegcc* \
+             | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -mingw32* | -linux-gnu* | -linux-android* \
+             | -linux-newlib* | -linux-uclibc* \
+             | -uxpv* | -beos* | -mpeix* | -udk* \
+             | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+             | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+             | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+             | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+             | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+             | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+             | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+       # Remember, each alternative MUST END IN *, to match a version number.
+               ;;
+       -qnx*)
+               case $basic_machine in
+                   x86-* | i*86-*)
+                       ;;
+                   *)
+                       os=-nto$os
+                       ;;
+               esac
+               ;;
+       -nto-qnx*)
+               ;;
+       -nto*)
+               os=`echo $os | sed -e 's|nto|nto-qnx|'`
+               ;;
+       -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+             | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+             | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+               ;;
+       -mac*)
+               os=`echo $os | sed -e 's|mac|macos|'`
+               ;;
+       -linux-dietlibc)
+               os=-linux-dietlibc
+               ;;
+       -linux*)
+               os=`echo $os | sed -e 's|linux|linux-gnu|'`
+               ;;
+       -sunos5*)
+               os=`echo $os | sed -e 's|sunos5|solaris2|'`
+               ;;
+       -sunos6*)
+               os=`echo $os | sed -e 's|sunos6|solaris3|'`
+               ;;
+       -opened*)
+               os=-openedition
+               ;;
+        -os400*)
+               os=-os400
+               ;;
+       -wince*)
+               os=-wince
+               ;;
+       -osfrose*)
+               os=-osfrose
+               ;;
+       -osf*)
+               os=-osf
+               ;;
+       -utek*)
+               os=-bsd
+               ;;
+       -dynix*)
+               os=-bsd
+               ;;
+       -acis*)
+               os=-aos
+               ;;
+       -atheos*)
+               os=-atheos
+               ;;
+       -syllable*)
+               os=-syllable
+               ;;
+       -386bsd)
+               os=-bsd
+               ;;
+       -ctix* | -uts*)
+               os=-sysv
+               ;;
+       -nova*)
+               os=-rtmk-nova
+               ;;
+       -ns2 )
+               os=-nextstep2
+               ;;
+       -nsk*)
+               os=-nsk
+               ;;
+       # Preserve the version number of sinix5.
+       -sinix5.*)
+               os=`echo $os | sed -e 's|sinix|sysv|'`
+               ;;
+       -sinix*)
+               os=-sysv4
+               ;;
+        -tpf*)
+               os=-tpf
+               ;;
+       -triton*)
+               os=-sysv3
+               ;;
+       -oss*)
+               os=-sysv3
+               ;;
+       -svr4)
+               os=-sysv4
+               ;;
+       -svr3)
+               os=-sysv3
+               ;;
+       -sysvr4)
+               os=-sysv4
+               ;;
+       # This must come after -sysvr4.
+       -sysv*)
+               ;;
+       -ose*)
+               os=-ose
+               ;;
+       -es1800*)
+               os=-ose
+               ;;
+       -xenix)
+               os=-xenix
+               ;;
+       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+               os=-mint
+               ;;
+       -aros*)
+               os=-aros
+               ;;
+       -kaos*)
+               os=-kaos
+               ;;
+       -zvmoe)
+               os=-zvmoe
+               ;;
+       -dicos*)
+               os=-dicos
+               ;;
+        -nacl*)
+               ;;
+       -none)
+               ;;
+       *)
+               # Get rid of the `-' at the beginning of $os.
+               os=`echo $os | sed 's/[^-]*-//'`
+               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+        score-*)
+               os=-elf
+               ;;
+        spu-*)
+               os=-elf
+               ;;
+       *-acorn)
+               os=-riscix1.2
+               ;;
+       arm*-rebel)
+               os=-linux
+               ;;
+       arm*-semi)
+               os=-aout
+               ;;
+        c4x-* | tic4x-*)
+               os=-coff
+               ;;
+       tic54x-*)
+               os=-coff
+               ;;
+       tic55x-*)
+               os=-coff
+               ;;
+       tic6x-*)
+               os=-coff
+               ;;
+       # This must come before the *-dec entry.
+       pdp10-*)
+               os=-tops20
+               ;;
+       pdp11-*)
+               os=-none
+               ;;
+       *-dec | vax-*)
+               os=-ultrix4.2
+               ;;
+       m68*-apollo)
+               os=-domain
+               ;;
+       i386-sun)
+               os=-sunos4.0.2
+               ;;
+       m68000-sun)
+               os=-sunos3
+               # This also exists in the configure program, but was not the
+               # default.
+               # os=-sunos4
+               ;;
+       m68*-cisco)
+               os=-aout
+               ;;
+        mep-*)
+               os=-elf
+               ;;
+       mips*-cisco)
+               os=-elf
+               ;;
+       mips*-*)
+               os=-elf
+               ;;
+       or32-*)
+               os=-coff
+               ;;
+       *-tti)  # must be before sparc entry or we get the wrong os.
+               os=-sysv3
+               ;;
+       sparc-* | *-sun)
+               os=-sunos4.1.1
+               ;;
+       *-be)
+               os=-beos
+               ;;
+       *-haiku)
+               os=-haiku
+               ;;
+       *-ibm)
+               os=-aix
+               ;;
+       *-knuth)
+               os=-mmixware
+               ;;
+       *-wec)
+               os=-proelf
+               ;;
+       *-winbond)
+               os=-proelf
+               ;;
+       *-oki)
+               os=-proelf
+               ;;
+       *-hp)
+               os=-hpux
+               ;;
+       *-hitachi)
+               os=-hiux
+               ;;
+       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+               os=-sysv
+               ;;
+       *-cbm)
+               os=-amigaos
+               ;;
+       *-dg)
+               os=-dgux
+               ;;
+       *-dolphin)
+               os=-sysv3
+               ;;
+       m68k-ccur)
+               os=-rtu
+               ;;
+       m88k-omron*)
+               os=-luna
+               ;;
+       *-next )
+               os=-nextstep
+               ;;
+       *-sequent)
+               os=-ptx
+               ;;
+       *-crds)
+               os=-unos
+               ;;
+       *-ns)
+               os=-genix
+               ;;
+       i370-*)
+               os=-mvs
+               ;;
+       *-next)
+               os=-nextstep3
+               ;;
+       *-gould)
+               os=-sysv
+               ;;
+       *-highlevel)
+               os=-bsd
+               ;;
+       *-encore)
+               os=-bsd
+               ;;
+       *-sgi)
+               os=-irix
+               ;;
+       *-siemens)
+               os=-sysv4
+               ;;
+       *-masscomp)
+               os=-rtu
+               ;;
+       f30[01]-fujitsu | f700-fujitsu)
+               os=-uxpv
+               ;;
+       *-rom68k)
+               os=-coff
+               ;;
+       *-*bug)
+               os=-coff
+               ;;
+       *-apple)
+               os=-macos
+               ;;
+       *-atari*)
+               os=-mint
+               ;;
+       *)
+               os=-none
+               ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+       *-unknown)
+               case $os in
+                       -riscix*)
+                               vendor=acorn
+                               ;;
+                       -sunos*)
+                               vendor=sun
+                               ;;
+                       -cnk*|-aix*)
+                               vendor=ibm
+                               ;;
+                       -beos*)
+                               vendor=be
+                               ;;
+                       -hpux*)
+                               vendor=hp
+                               ;;
+                       -mpeix*)
+                               vendor=hp
+                               ;;
+                       -hiux*)
+                               vendor=hitachi
+                               ;;
+                       -unos*)
+                               vendor=crds
+                               ;;
+                       -dgux*)
+                               vendor=dg
+                               ;;
+                       -luna*)
+                               vendor=omron
+                               ;;
+                       -genix*)
+                               vendor=ns
+                               ;;
+                       -mvs* | -opened*)
+                               vendor=ibm
+                               ;;
+                       -os400*)
+                               vendor=ibm
+                               ;;
+                       -ptx*)
+                               vendor=sequent
+                               ;;
+                       -tpf*)
+                               vendor=ibm
+                               ;;
+                       -vxsim* | -vxworks* | -windiss*)
+                               vendor=wrs
+                               ;;
+                       -aux*)
+                               vendor=apple
+                               ;;
+                       -hms*)
+                               vendor=hitachi
+                               ;;
+                       -mpw* | -macos*)
+                               vendor=apple
+                               ;;
+                       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+                               vendor=atari
+                               ;;
+                       -vos*)
+                               vendor=stratus
+                               ;;
+               esac
+               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+               ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..244ebc1
--- /dev/null
+++ b/configure
@@ -0,0 +1,12115 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.68 for xkbcomp 1.2.4.
+#
+# Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg>.
+#
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+# Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+        /*)
+          for as_base in sh bash ksh sh5; do
+            # Try only shells that exist, to save several forks.
+            as_shell=$as_dir/$as_base
+            if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+                   { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+                  if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+          done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+             { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  # We cannot yet assume a decent shell, so we have to provide a
+       # neutralization value for shells without unset; and this also
+       # works around shells that cannot unset nonexistent variables.
+       # Preserve -v and -x to the replacement shell.
+       BASH_ENV=/dev/null
+       ENV=/dev/null
+       (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+       export CONFIG_SHELL
+       case $- in # ((((
+         *v*x* | *x*v* ) as_opts=-vx ;;
+         *v* ) as_opts=-v ;;
+         *x* ) as_opts=-x ;;
+         * ) as_opts= ;;
+       esac
+       exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: https://bugs.freedesktop.org/enter_bug.cgi?product=xorg
+$0: about your system, including any error possibly output
+$0: before this message. Then install a modern shell, or
+$0: manually run the script under such a shell if you do
+$0: have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='        ';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+       test -d "$1/.";
+      else
+       case $1 in #(
+       -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='xkbcomp'
+PACKAGE_TARNAME='xkbcomp'
+PACKAGE_VERSION='1.2.4'
+PACKAGE_STRING='xkbcomp 1.2.4'
+PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=xorg'
+PACKAGE_URL=''
+
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+XKBCONFIGROOT
+REQUIRED_MODULES
+XKBCOMP_LIBS
+XKBCOMP_CFLAGS
+YACC_INST
+YFLAGS
+YACC
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+MAN_SUBSTS
+XORG_MAN_PAGE
+ADMIN_MAN_DIR
+DRIVER_MAN_DIR
+MISC_MAN_DIR
+FILE_MAN_DIR
+LIB_MAN_DIR
+APP_MAN_DIR
+ADMIN_MAN_SUFFIX
+DRIVER_MAN_SUFFIX
+MISC_MAN_SUFFIX
+FILE_MAN_SUFFIX
+LIB_MAN_SUFFIX
+APP_MAN_SUFFIX
+SED
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+INSTALL_CMD
+PKG_CONFIG
+CHANGELOG_CMD
+STRICT_CFLAGS
+CWARNFLAGS
+BASE_CFLAGS
+EGREP
+GREP
+CPP
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_maintainer_mode
+enable_dependency_tracking
+enable_selective_werror
+enable_strict_compilation
+enable_silent_rules
+with_xkb_config_root
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+PKG_CONFIG
+YACC
+YFLAGS
+XKBCOMP_CFLAGS
+XKBCOMP_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used" >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_myself" : 'X\(//\)[^/]' \| \
+        X"$as_myself" : 'X\(//\)$' \| \
+        X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures xkbcomp 1.2.4 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/xkbcomp]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of xkbcomp 1.2.4:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-maintainer-mode  enable make rules and dependencies not useful
+                         (and sometimes confusing) to the casual installer
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+  --disable-selective-werror
+                          Turn off selective compiler errors. (default:
+                          enabled)
+  --enable-strict-compilation
+                          Enable all warnings from compiler and make them
+                          errors (default: disabled)
+  --enable-silent-rules          less verbose build output (undo: `make V=1')
+  --disable-silent-rules         verbose build output (undo: `make V=0')
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-xkb-config-root=<paths>
+                          Set default XKB config root (default:
+                          ${datadir}/X11/xkb)
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+  PKG_CONFIG  path to pkg-config utility
+  YACC        The `Yet Another Compiler Compiler' implementation to use.
+              Defaults to the first program found out of: `bison -y', `byacc',
+              `yacc'.
+  YFLAGS      The list of arguments that will be passed by default to $YACC.
+              This script will default YFLAGS to the empty string to avoid a
+              default value of `-d' given by some make applications.
+  XKBCOMP_CFLAGS
+              C compiler flags for XKBCOMP, overriding pkg-config
+  XKBCOMP_LIBS
+              linker flags for XKBCOMP, overriding pkg-config
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+xkbcomp configure 1.2.4
+generated by GNU Autoconf 2.68
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  as_decl_name=`echo $2|sed 's/ *(.*//'`
+  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+  (void) $as_decl_use;
+#else
+  (void) $as_decl_name;
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_decl
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by xkbcomp $as_me 1.2.4, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       $as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       # differences in whitespace do not lead to failure.
+       ac_old_val_w=`echo x $ac_old_val`
+       ac_new_val_w=`echo x $ac_new_val`
+       if test "$ac_old_val_w" != "$ac_new_val_w"; then
+         { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+         ac_cache_corrupted=:
+       else
+         { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+         eval $ac_var=\$ac_old_val
+       fi
+       { $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+       { $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+am__api_version='1.11'
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+       if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+         if test $ac_prog = install &&
+           grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         elif test $ac_prog = install &&
+           grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # program-specific install script used by HP pwplus--don't use.
+           :
+         else
+           rm -rf conftest.one conftest.two conftest.dir
+           echo one > conftest.one
+           echo two > conftest.two
+           mkdir conftest.dir
+           if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+             test -s conftest.one && test -s conftest.two &&
+             test -s conftest.dir/conftest.one &&
+             test -s conftest.dir/conftest.two
+           then
+             ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+             break 3
+           fi
+         fi
+       fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \    ]*)
+    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+        for ac_exec_ext in '' $ac_executable_extensions; do
+          { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+          case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+            'mkdir (GNU coreutils) '* | \
+            'mkdir (coreutils) '* | \
+            'mkdir (fileutils) '4.1*)
+              ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+              break 3;;
+          esac
+        done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+       @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='xkbcomp'
+ VERSION='1.2.4'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+    # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then :
+  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+  USE_MAINTAINER_MODE=no
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+$as_echo "$USE_MAINTAINER_MODE" >&6; }
+   if test $USE_MAINTAINER_MODE = yes; then
+  MAINTAINER_MODE_TRUE=
+  MAINTAINER_MODE_FALSE='#'
+else
+  MAINTAINER_MODE_TRUE='#'
+  MAINTAINER_MODE_FALSE=
+fi
+
+  MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+# Require X.Org macros 1.8 or later for MAN_SUBSTS set by XORG_MANPAGE_SECTIONS
+
+
+
+
+
+
+
+
+
+
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+       if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+       then :; else
+          ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       fi
+       # We set ac_cv_exeext here because the later test for it is not
+       # safe: cross compilers may not add the suffix if given an `-o'
+       # argument, so we may need to know it at that point already.
+       # Even if this section looks crufty: it has the advantage of
+       # actually working.
+       break;;
+    * )
+       break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+        CFLAGS="-g"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5
+$as_echo_n "checking for $CC option to accept ISO C99... " >&6; }
+if ${ac_cv_prog_cc_c99+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <stdio.h>
+
+// Check varargs macros.  These examples are taken from C99 6.10.3.5.
+#define debug(...) fprintf (stderr, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+  int x = 1234;
+  int y = 5678;
+  debug ("Flag");
+  debug ("X = %d\n", x);
+  showlist (The first, second, and third items.);
+  report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+  your preprocessor is broken;
+#endif
+#if BIG_OK
+#else
+  your preprocessor is broken;
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+  int datasize;
+  double data[];
+};
+
+struct named_init {
+  int number;
+  const wchar_t *name;
+  double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+  // See if C++-style comments work.
+  // Iterate through items via the restricted pointer.
+  // Also check for declarations in for loops.
+  for (unsigned int i = 0; *(text+i) != '\0'; ++i)
+    continue;
+  return 0;
+}
+
+// Check varargs and va_copy.
+static void
+test_varargs (const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+  va_list args_copy;
+  va_copy (args_copy, args);
+
+  const char *str;
+  int number;
+  float fnumber;
+
+  while (*format)
+    {
+      switch (*format++)
+       {
+       case 's': // string
+         str = va_arg (args_copy, const char *);
+         break;
+       case 'd': // int
+         number = va_arg (args_copy, int);
+         break;
+       case 'f': // float
+         fnumber = va_arg (args_copy, double);
+         break;
+       default:
+         break;
+       }
+    }
+  va_end (args_copy);
+  va_end (args);
+}
+
+int
+main ()
+{
+
+  // Check bool.
+  _Bool success = false;
+
+  // Check restrict.
+  if (test_restrict ("String literal") == 0)
+    success = true;
+  char *restrict newvar = "Another string";
+
+  // Check varargs.
+  test_varargs ("s, d' f .", "string", 65, 34.234);
+  test_varargs_macros ();
+
+  // Check flexible array members.
+  struct incomplete_array *ia =
+    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+  ia->datasize = 10;
+  for (int i = 0; i < ia->datasize; ++i)
+    ia->data[i] = i * 1.234;
+
+  // Check named initializers.
+  struct named_init ni = {
+    .number = 34,
+    .name = L"Test wide string",
+    .average = 543.34343,
+  };
+
+  ni.number = 58;
+
+  int dynamic_array[ni.number];
+  dynamic_array[ni.number - 1] = 543;
+
+  // work around unused variable warnings
+  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
+         || dynamic_array[ni.number - 1] != 543);
+
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -xc99=all -qlanglvl=extc99
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c99" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c99"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c99" != xno; then :
+
+fi
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                 inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+
+ac_fn_c_check_decl "$LINENO" "__clang__" "ac_cv_have_decl___clang__" "$ac_includes_default"
+if test "x$ac_cv_have_decl___clang__" = xyes; then :
+  CLANGCC="yes"
+else
+  CLANGCC="no"
+fi
+
+ac_fn_c_check_decl "$LINENO" "__INTEL_COMPILER" "ac_cv_have_decl___INTEL_COMPILER" "$ac_includes_default"
+if test "x$ac_cv_have_decl___INTEL_COMPILER" = xyes; then :
+  INTELCC="yes"
+else
+  INTELCC="no"
+fi
+
+ac_fn_c_check_decl "$LINENO" "__SUNPRO_C" "ac_cv_have_decl___SUNPRO_C" "$ac_includes_default"
+if test "x$ac_cv_have_decl___SUNPRO_C" = xyes; then :
+  SUNCC="yes"
+else
+  SUNCC="no"
+fi
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=0.9.0
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       else
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+               PKG_CONFIG=""
+       fi
+
+fi
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+
+
+
+
+
+# Check whether --enable-selective-werror was given.
+if test "${enable_selective_werror+set}" = set; then :
+  enableval=$enable_selective_werror; SELECTIVE_WERROR=$enableval
+else
+  SELECTIVE_WERROR=yes
+fi
+
+
+
+
+
+# -v is too short to test reliably with XORG_TESTSET_CFLAG
+if test "x$SUNCC" = "xyes"; then
+    BASE_CFLAGS="-v"
+else
+    BASE_CFLAGS=""
+fi
+
+# This chunk of warnings were those that existed in the legacy CWARNFLAGS
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wall"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wall" >&5
+$as_echo_n "checking if $CC supports-Wall... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wall
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wall"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wpointer-arith"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wpointer-arith" >&5
+$as_echo_n "checking if $CC supports-Wpointer-arith... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wpointer_arith
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wpointer-arith"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wmissing-declarations"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wmissing-declarations" >&5
+$as_echo_n "checking if $CC supports-Wmissing-declarations... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wmissing_declarations
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wmissing-declarations"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wformat=2"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wformat=2" >&5
+$as_echo_n "checking if $CC supports-Wformat=2... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-Wformat=2" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wformat=2"
+                       found="yes"
+               fi
+       fi
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wformat"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wformat" >&5
+$as_echo_n "checking if $CC supports-Wformat... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wformat
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wformat"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wstrict-prototypes"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wstrict-prototypes" >&5
+$as_echo_n "checking if $CC supports-Wstrict-prototypes... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wstrict_prototypes
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wstrict-prototypes"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wmissing-prototypes"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wmissing-prototypes" >&5
+$as_echo_n "checking if $CC supports-Wmissing-prototypes... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wmissing_prototypes
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wmissing-prototypes"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wnested-externs"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wnested-externs" >&5
+$as_echo_n "checking if $CC supports-Wnested-externs... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wnested_externs
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wnested-externs"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wbad-function-cast"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wbad-function-cast" >&5
+$as_echo_n "checking if $CC supports-Wbad-function-cast... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wbad_function_cast
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wbad-function-cast"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wold-style-definition"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wold-style-definition" >&5
+$as_echo_n "checking if $CC supports-Wold-style-definition... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wold_style_definition
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wold-style-definition"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wdeclaration-after-statement"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wdeclaration-after-statement" >&5
+$as_echo_n "checking if $CC supports-Wdeclaration-after-statement... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wdeclaration_after_statement
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wdeclaration-after-statement"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+# This chunk adds additional warnings that could catch undesired effects.
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wunused"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wunused" >&5
+$as_echo_n "checking if $CC supports-Wunused... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wunused
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wunused"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wuninitialized"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wuninitialized" >&5
+$as_echo_n "checking if $CC supports-Wuninitialized... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wuninitialized
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wuninitialized"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wshadow"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wshadow" >&5
+$as_echo_n "checking if $CC supports-Wshadow... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wshadow
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wshadow"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wcast-qual"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wcast-qual" >&5
+$as_echo_n "checking if $CC supports-Wcast-qual... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wcast_qual
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wcast-qual"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wmissing-noreturn"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wmissing-noreturn" >&5
+$as_echo_n "checking if $CC supports-Wmissing-noreturn... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wmissing_noreturn
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wmissing-noreturn"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wmissing-format-attribute"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wmissing-format-attribute" >&5
+$as_echo_n "checking if $CC supports-Wmissing-format-attribute... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wmissing_format_attribute
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wmissing-format-attribute"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wredundant-decls"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wredundant-decls" >&5
+$as_echo_n "checking if $CC supports-Wredundant-decls... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wredundant_decls
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wredundant-decls"
+                       found="yes"
+               fi
+       fi
+
+
+
+# These are currently disabled because they are noisy.  They will be enabled
+# in the future once the codebase is sufficiently modernized to silence
+# them.  For now, I don't want them to drown out the other warnings.
+# XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wlogical-op])
+# XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wparentheses])
+# XORG_TESTSET_CFLAG([[BASE_]PREFIX[FLAGS]], [-Wcast-align])
+
+# Turn some warnings into errors, so we don't accidently get successful builds
+# when there are problems that should be fixed.
+
+if test "x$SELECTIVE_WERROR" = "xyes" ; then
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Werror=implicit"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Werror=implicit" >&5
+$as_echo_n "checking if $CC supports-Werror=implicit... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-Werror=implicit" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Werror=implicit"
+                       found="yes"
+               fi
+       fi
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -errwarn=E_NO_EXPLICIT_TYPE_GIVEN -errwarn=E_NO_IMPLICIT_DECL_ALLOWED"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-errwarn=E_NO_EXPLICIT_TYPE_GIVEN -errwarn=E_NO_IMPLICIT_DECL_ALLOWED" >&5
+$as_echo_n "checking if $CC supports-errwarn=E_NO_EXPLICIT_TYPE_GIVEN -errwarn=E_NO_IMPLICIT_DECL_ALLOWED... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-errwarn=E_NO_EXPLICIT_TYPE_GIVEN -errwarn=E_NO_IMPLICIT_DECL_ALLOWED" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -errwarn=E_NO_EXPLICIT_TYPE_GIVEN -errwarn=E_NO_IMPLICIT_DECL_ALLOWED"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Werror=nonnull"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Werror=nonnull" >&5
+$as_echo_n "checking if $CC supports-Werror=nonnull... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-Werror=nonnull" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Werror=nonnull"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Werror=init-self"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Werror=init-self" >&5
+$as_echo_n "checking if $CC supports-Werror=init-self... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-Werror=init-self" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Werror=init-self"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Werror=main"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Werror=main" >&5
+$as_echo_n "checking if $CC supports-Werror=main... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-Werror=main" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Werror=main"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Werror=missing-braces"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Werror=missing-braces" >&5
+$as_echo_n "checking if $CC supports-Werror=missing-braces... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-Werror=missing-braces" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Werror=missing-braces"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Werror=sequence-point"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Werror=sequence-point" >&5
+$as_echo_n "checking if $CC supports-Werror=sequence-point... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-Werror=sequence-point" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Werror=sequence-point"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Werror=return-type"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Werror=return-type" >&5
+$as_echo_n "checking if $CC supports-Werror=return-type... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-Werror=return-type" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Werror=return-type"
+                       found="yes"
+               fi
+       fi
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -errwarn=E_FUNC_HAS_NO_RETURN_STMT"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-errwarn=E_FUNC_HAS_NO_RETURN_STMT" >&5
+$as_echo_n "checking if $CC supports-errwarn=E_FUNC_HAS_NO_RETURN_STMT... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-errwarn=E_FUNC_HAS_NO_RETURN_STMT" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -errwarn=E_FUNC_HAS_NO_RETURN_STMT"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Werror=trigraphs"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Werror=trigraphs" >&5
+$as_echo_n "checking if $CC supports-Werror=trigraphs... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-Werror=trigraphs" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Werror=trigraphs"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Werror=array-bounds"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Werror=array-bounds" >&5
+$as_echo_n "checking if $CC supports-Werror=array-bounds... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-Werror=array-bounds" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Werror=array-bounds"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Werror=write-strings"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Werror=write-strings" >&5
+$as_echo_n "checking if $CC supports-Werror=write-strings... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-Werror=write-strings" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Werror=write-strings"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Werror=address"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Werror=address" >&5
+$as_echo_n "checking if $CC supports-Werror=address... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-Werror=address" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Werror=address"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Werror=int-to-pointer-cast"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Werror=int-to-pointer-cast" >&5
+$as_echo_n "checking if $CC supports-Werror=int-to-pointer-cast... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-Werror=int-to-pointer-cast" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Werror=int-to-pointer-cast"
+                       found="yes"
+               fi
+       fi
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -errwarn=E_BAD_PTR_INT_COMBINATION"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-errwarn=E_BAD_PTR_INT_COMBINATION" >&5
+$as_echo_n "checking if $CC supports-errwarn=E_BAD_PTR_INT_COMBINATION... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-errwarn=E_BAD_PTR_INT_COMBINATION" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -errwarn=E_BAD_PTR_INT_COMBINATION"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Werror=pointer-to-int-cast"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Werror=pointer-to-int-cast" >&5
+$as_echo_n "checking if $CC supports-Werror=pointer-to-int-cast... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-Werror=pointer-to-int-cast" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Werror=pointer-to-int-cast"
+                       found="yes"
+               fi
+       fi
+
+ # Also -errwarn=E_BAD_PTR_INT_COMBINATION
+else
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You have chosen not to turn some select compiler warnings into errors.  This should not be necessary.  Please report why you needed to do so in a bug report at $PACKAGE_BUGREPORT" >&5
+$as_echo "$as_me: WARNING: You have chosen not to turn some select compiler warnings into errors.  This should not be necessary.  Please report why you needed to do so in a bug report at $PACKAGE_BUGREPORT" >&2;}
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wimplicit"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wimplicit" >&5
+$as_echo_n "checking if $CC supports-Wimplicit... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wimplicit
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wimplicit"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wnonnull"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wnonnull" >&5
+$as_echo_n "checking if $CC supports-Wnonnull... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wnonnull
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wnonnull"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Winit-self"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Winit-self" >&5
+$as_echo_n "checking if $CC supports-Winit-self... " >&6; }
+               cacheid=xorg_cv_cc_flag__Winit_self
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Winit-self"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wmain"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wmain" >&5
+$as_echo_n "checking if $CC supports-Wmain... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wmain
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wmain"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wmissing-braces"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wmissing-braces" >&5
+$as_echo_n "checking if $CC supports-Wmissing-braces... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wmissing_braces
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wmissing-braces"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wsequence-point"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wsequence-point" >&5
+$as_echo_n "checking if $CC supports-Wsequence-point... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wsequence_point
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wsequence-point"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wreturn-type"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wreturn-type" >&5
+$as_echo_n "checking if $CC supports-Wreturn-type... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wreturn_type
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wreturn-type"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wtrigraphs"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wtrigraphs" >&5
+$as_echo_n "checking if $CC supports-Wtrigraphs... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wtrigraphs
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wtrigraphs"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Warray-bounds"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Warray-bounds" >&5
+$as_echo_n "checking if $CC supports-Warray-bounds... " >&6; }
+               cacheid=xorg_cv_cc_flag__Warray_bounds
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Warray-bounds"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wwrite-strings"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wwrite-strings" >&5
+$as_echo_n "checking if $CC supports-Wwrite-strings... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wwrite_strings
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wwrite-strings"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Waddress"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Waddress" >&5
+$as_echo_n "checking if $CC supports-Waddress... " >&6; }
+               cacheid=xorg_cv_cc_flag__Waddress
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Waddress"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wint-to-pointer-cast"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wint-to-pointer-cast" >&5
+$as_echo_n "checking if $CC supports-Wint-to-pointer-cast... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wint_to_pointer_cast
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wint-to-pointer-cast"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Wpointer-to-int-cast"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Wpointer-to-int-cast" >&5
+$as_echo_n "checking if $CC supports-Wpointer-to-int-cast... " >&6; }
+               cacheid=xorg_cv_cc_flag__Wpointer_to_int_cast
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       BASE_CFLAGS="$BASE_CFLAGS -Wpointer-to-int-cast"
+                       found="yes"
+               fi
+       fi
+
+
+fi
+
+
+
+
+
+
+
+               CWARNFLAGS="$BASE_CFLAGS"
+               if  test "x$GCC" = xyes ; then
+                   CWARNFLAGS="$CWARNFLAGS -fno-strict-aliasing"
+               fi
+
+
+
+
+
+
+
+
+# Check whether --enable-strict-compilation was given.
+if test "${enable_strict_compilation+set}" = set; then :
+  enableval=$enable_strict_compilation; STRICT_COMPILE=$enableval
+else
+  STRICT_COMPILE=no
+fi
+
+
+
+
+
+
+STRICT_CFLAGS=""
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -pedantic"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-pedantic" >&5
+$as_echo_n "checking if $CC supports-pedantic... " >&6; }
+               cacheid=xorg_cv_cc_flag__pedantic
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       STRICT_CFLAGS="$STRICT_CFLAGS -pedantic"
+                       found="yes"
+               fi
+       fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Werror"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Werror" >&5
+$as_echo_n "checking if $CC supports-Werror... " >&6; }
+               cacheid=xorg_cv_cc_flag__Werror
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       STRICT_CFLAGS="$STRICT_CFLAGS -Werror"
+                       found="yes"
+               fi
+       fi
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -errwarn"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-errwarn" >&5
+$as_echo_n "checking if $CC supports-errwarn... " >&6; }
+               cacheid=xorg_cv_cc_flag__errwarn
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       STRICT_CFLAGS="$STRICT_CFLAGS -errwarn"
+                       found="yes"
+               fi
+       fi
+
+
+
+# Earlier versions of gcc (eg: 4.2) support -Werror=attributes, but do not
+# activate it with -Werror, so we add it here explicitly.
+
+
+
+
+
+
+
+
+
+
+
+
+
+xorg_testset_save_CFLAGS="$CFLAGS"
+
+if test "x$xorg_testset_cc_unknown_warning_option" = "x" ; then
+       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unknown-warning-option" >&5
+$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; }
+if ${xorg_cv_cc_flag_unknown_warning_option+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unknown_warning_option=yes
+else
+  xorg_cv_cc_flag_unknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unknown_warning_option" >&5
+$as_echo "$xorg_cv_cc_flag_unknown_warning_option" >&6; }
+       xorg_testset_cc_unknown_warning_option=$xorg_cv_cc_flag_unknown_warning_option
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+if test "x$xorg_testset_cc_unused_command_line_argument" = "x" ; then
+       if test "x$xorg_testset_cc_unknown_warning_option" = "xyes" ; then
+               CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+       fi
+       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror=unused-command-line-argument" >&5
+$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; }
+if ${xorg_cv_cc_flag_unused_command_line_argument+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  xorg_cv_cc_flag_unused_command_line_argument=yes
+else
+  xorg_cv_cc_flag_unused_command_line_argument=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xorg_cv_cc_flag_unused_command_line_argument" >&5
+$as_echo "$xorg_cv_cc_flag_unused_command_line_argument" >&6; }
+       xorg_testset_cc_unused_command_line_argument=$xorg_cv_cc_flag_unused_command_line_argument
+       CFLAGS="$xorg_testset_save_CFLAGS"
+fi
+
+found="no"
+
+       if test $found = "no" ; then
+               if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unknown-warning-option"
+               fi
+
+               if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then
+                       CFLAGS="$CFLAGS -Werror=unused-command-line-argument"
+               fi
+
+               CFLAGS="$CFLAGS -Werror=attributes"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports-Werror=attributes" >&5
+$as_echo_n "checking if $CC supports-Werror=attributes... " >&6; }
+               cacheid=`$as_echo "xorg_cv_cc_flag_-Werror=attributes" | $as_tr_sh`
+               if eval \${$cacheid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int i;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval $cacheid=yes
+else
+  eval $cacheid=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+               CFLAGS="$xorg_testset_save_CFLAGS"
+
+               eval supported=\$$cacheid
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $supported" >&5
+$as_echo "$supported" >&6; }
+               if test "$supported" = "yes" ; then
+                       STRICT_CFLAGS="$STRICT_CFLAGS -Werror=attributes"
+                       found="yes"
+               fi
+       fi
+
+
+
+if test "x$STRICT_COMPILE" = "xyes"; then
+    BASE_CFLAGS="$BASE_CFLAGS $STRICT_CFLAGS"
+    CWARNFLAGS="$CWARNFLAGS $STRICT_CFLAGS"
+fi
+
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION_MAJOR `echo $PACKAGE_VERSION | cut -d . -f 1`
+_ACEOF
+
+       PVM=`echo $PACKAGE_VERSION | cut -d . -f 2 | cut -d - -f 1`
+       if test "x$PVM" = "x"; then
+               PVM="0"
+       fi
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION_MINOR $PVM
+_ACEOF
+
+       PVP=`echo $PACKAGE_VERSION | cut -d . -f 3 | cut -d - -f 1`
+       if test "x$PVP" = "x"; then
+               PVP="0"
+       fi
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION_PATCHLEVEL $PVP
+_ACEOF
+
+
+
+CHANGELOG_CMD="(GIT_DIR=\$(top_srcdir)/.git git log > \$(top_srcdir)/.changelog.tmp && \
+mv \$(top_srcdir)/.changelog.tmp \$(top_srcdir)/ChangeLog) \
+|| (rm -f \$(top_srcdir)/.changelog.tmp; touch \$(top_srcdir)/ChangeLog; \
+echo 'git directory not found: installing possibly empty changelog.' >&2)"
+
+
+
+
+macros_datadir=`$PKG_CONFIG --print-errors --variable=pkgdatadir xorg-macros`
+INSTALL_CMD="(cp -f "$macros_datadir/INSTALL" \$(top_srcdir)/.INSTALL.tmp && \
+mv \$(top_srcdir)/.INSTALL.tmp \$(top_srcdir)/INSTALL) \
+|| (rm -f \$(top_srcdir)/.INSTALL.tmp; touch \$(top_srcdir)/INSTALL; \
+echo 'util-macros \"pkgdatadir\" from xorg-macros.pc not found: installing possibly empty INSTALL.' >&2)"
+
+
+
+
+
+
+if test x$APP_MAN_SUFFIX = x    ; then
+    APP_MAN_SUFFIX=1
+fi
+if test x$APP_MAN_DIR = x    ; then
+    APP_MAN_DIR='$(mandir)/man$(APP_MAN_SUFFIX)'
+fi
+
+if test x$LIB_MAN_SUFFIX = x    ; then
+    LIB_MAN_SUFFIX=3
+fi
+if test x$LIB_MAN_DIR = x    ; then
+    LIB_MAN_DIR='$(mandir)/man$(LIB_MAN_SUFFIX)'
+fi
+
+if test x$FILE_MAN_SUFFIX = x    ; then
+    case $host_os in
+       solaris*)       FILE_MAN_SUFFIX=4  ;;
+       *)              FILE_MAN_SUFFIX=5  ;;
+    esac
+fi
+if test x$FILE_MAN_DIR = x    ; then
+    FILE_MAN_DIR='$(mandir)/man$(FILE_MAN_SUFFIX)'
+fi
+
+if test x$MISC_MAN_SUFFIX = x    ; then
+    case $host_os in
+       solaris*)       MISC_MAN_SUFFIX=5  ;;
+       *)              MISC_MAN_SUFFIX=7  ;;
+    esac
+fi
+if test x$MISC_MAN_DIR = x    ; then
+    MISC_MAN_DIR='$(mandir)/man$(MISC_MAN_SUFFIX)'
+fi
+
+if test x$DRIVER_MAN_SUFFIX = x    ; then
+    case $host_os in
+       solaris*)       DRIVER_MAN_SUFFIX=7  ;;
+       *)              DRIVER_MAN_SUFFIX=4  ;;
+    esac
+fi
+if test x$DRIVER_MAN_DIR = x    ; then
+    DRIVER_MAN_DIR='$(mandir)/man$(DRIVER_MAN_SUFFIX)'
+fi
+
+if test x$ADMIN_MAN_SUFFIX = x    ; then
+    case $host_os in
+       solaris*)       ADMIN_MAN_SUFFIX=1m ;;
+       *)              ADMIN_MAN_SUFFIX=8  ;;
+    esac
+fi
+if test x$ADMIN_MAN_DIR = x    ; then
+    ADMIN_MAN_DIR='$(mandir)/man$(ADMIN_MAN_SUFFIX)'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+XORG_MAN_PAGE="X Version 11"
+
+MAN_SUBSTS="\
+       -e 's|__vendorversion__|\"\$(PACKAGE_STRING)\" \"\$(XORG_MAN_PAGE)\"|' \
+       -e 's|__xorgversion__|\"\$(PACKAGE_STRING)\" \"\$(XORG_MAN_PAGE)\"|' \
+       -e 's|__xservername__|Xorg|g' \
+       -e 's|__xconfigfile__|xorg.conf|g' \
+       -e 's|__projectroot__|\$(prefix)|g' \
+       -e 's|__apploaddir__|\$(appdefaultdir)|g' \
+       -e 's|__appmansuffix__|\$(APP_MAN_SUFFIX)|g' \
+       -e 's|__drivermansuffix__|\$(DRIVER_MAN_SUFFIX)|g' \
+       -e 's|__adminmansuffix__|\$(ADMIN_MAN_SUFFIX)|g' \
+       -e 's|__libmansuffix__|\$(LIB_MAN_SUFFIX)|g' \
+       -e 's|__miscmansuffix__|\$(MISC_MAN_SUFFIX)|g' \
+       -e 's|__filemansuffix__|\$(FILE_MAN_SUFFIX)|g'"
+
+
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+  enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in
+yes) AM_DEFAULT_VERBOSITY=0;;
+no)  AM_DEFAULT_VERBOSITY=1;;
+*)   AM_DEFAULT_VERBOSITY=0;;
+esac
+AM_BACKSLASH='\'
+
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+
+# If both the C file and YACC are missing, the package cannot be build.
+for ac_prog in 'bison -y' byacc
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_YACC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$YACC"; then
+  ac_cv_prog_YACC="$YACC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_YACC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+YACC=$ac_cv_prog_YACC
+if test -n "$YACC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5
+$as_echo "$YACC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$YACC" && break
+done
+test -n "$YACC" || YACC="yacc"
+
+# Extract the first word of "$YACC", so it can be a program name with args.
+set dummy $YACC; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_YACC_INST+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $YACC_INST in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_YACC_INST="$YACC_INST" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_YACC_INST="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+YACC_INST=$ac_cv_path_YACC_INST
+if test -n "$YACC_INST"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC_INST" >&5
+$as_echo "$YACC_INST" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test ! -f "$srcdir/xkbparse.c"; then
+   if test -z "$YACC_INST"; then
+      as_fn_error $? "yacc not found - unable to compile xkbparse.y" "$LINENO" 5
+   fi
+fi
+
+for ac_func in strdup strcasecmp
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+REQUIRED_MODULES="x11 xkbfile xproto >= 7.0.17"
+
+# Checks for pkg-config packages
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XKBCOMP" >&5
+$as_echo_n "checking for XKBCOMP... " >&6; }
+
+if test -n "$XKBCOMP_CFLAGS"; then
+    pkg_cv_XKBCOMP_CFLAGS="$XKBCOMP_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$REQUIRED_MODULES\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$REQUIRED_MODULES") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_XKBCOMP_CFLAGS=`$PKG_CONFIG --cflags "$REQUIRED_MODULES" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$XKBCOMP_LIBS"; then
+    pkg_cv_XKBCOMP_LIBS="$XKBCOMP_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$REQUIRED_MODULES\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$REQUIRED_MODULES") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_XKBCOMP_LIBS=`$PKG_CONFIG --libs "$REQUIRED_MODULES" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               XKBCOMP_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$REQUIRED_MODULES" 2>&1`
+        else
+               XKBCOMP_PKG_ERRORS=`$PKG_CONFIG --print-errors "$REQUIRED_MODULES" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$XKBCOMP_PKG_ERRORS" >&5
+
+       as_fn_error $? "Package requirements ($REQUIRED_MODULES) were not met:
+
+$XKBCOMP_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables XKBCOMP_CFLAGS
+and XKBCOMP_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables XKBCOMP_CFLAGS
+and XKBCOMP_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+       XKBCOMP_CFLAGS=$pkg_cv_XKBCOMP_CFLAGS
+       XKBCOMP_LIBS=$pkg_cv_XKBCOMP_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       :
+fi
+
+
+
+# Check whether --with-xkb_config_root was given.
+if test "${with_xkb_config_root+set}" = set; then :
+  withval=$with_xkb_config_root; XKBCONFIGROOT="$withval"
+else
+  XKBCONFIGROOT='${datadir}/X11/xkb'
+fi
+
+
+
+
+ac_config_files="$ac_config_files Makefile man/Makefile xkbcomp.pc"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+       cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+         mv -f confcache "$cache_file"$$ &&
+         mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+         mv -f confcache "$cache_file" ;;
+       esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+  as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='        ';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+       test -d "$1/.";
+      else
+       case $1 in #(
+       -*)set "./$1";;
+       esac;
+       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+       ???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by xkbcomp $as_me 1.2.4, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+xkbcomp config.status 1.2.4
+configured by $0, generated by GNU Autoconf 2.68,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;;
+    "xkbcomp.pc") CONFIG_FILES="$CONFIG_FILES xkbcomp.pc" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = "\a"
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=[    ]*/{
+h
+s///
+s/^/:/
+s/[     ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[  ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[    ]*#[    ]*define[       ][      ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[    ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[        ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[    ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[        ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = "\a"
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+         $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+       `' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+       || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$_am_arg" : 'X\(//\)[^/]' \| \
+        X"$_am_arg" : 'X\(//\)$' \| \
+        X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$mf" : 'X\(//\)[^/]' \| \
+        X"$mf" : 'X\(//\)$' \| \
+        X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$file" : 'X\(//\)[^/]' \| \
+        X"$file" : 'X\(//\)$' \| \
+        X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/configure.ac b/configure.ac
new file mode 100644 (file)
index 0000000..f9175b6
--- /dev/null
@@ -0,0 +1,66 @@
+dnl  Copyright 2005 Red Hat, Inc.
+dnl 
+dnl  Permission to use, copy, modify, distribute, and sell this software and its
+dnl  documentation for any purpose is hereby granted without fee, provided that
+dnl  the above copyright notice appear in all copies and that both that
+dnl  copyright notice and this permission notice appear in supporting
+dnl  documentation, and that the name of Red Hat not be used in
+dnl  advertising or publicity pertaining to distribution of the software without
+dnl  specific, written prior permission.  Red Hat makes no
+dnl  representations about the suitability of this software for any purpose.  It
+dnl  is provided "as is" without express or implied warranty.
+dnl 
+dnl  RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+dnl  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+dnl  EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+dnl  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+dnl  DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+dnl  TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+dnl  PERFORMANCE OF THIS SOFTWARE.
+dnl
+dnl Process this file with autoconf to create configure.
+
+AC_PREREQ([2.60])
+AC_INIT([xkbcomp], [1.2.4],
+        [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [xkbcomp])
+AM_INIT_AUTOMAKE([foreign dist-bzip2])
+AM_MAINTAINER_MODE
+
+# Require X.Org macros 1.8 or later for MAN_SUBSTS set by XORG_MANPAGE_SECTIONS
+m4_ifndef([XORG_MACROS_VERSION],
+          [m4_fatal([must install xorg-macros 1.8 or later before running autoconf/autogen])])
+XORG_MACROS_VERSION(1.8)
+XORG_DEFAULT_OPTIONS
+
+AC_CONFIG_HEADERS([config.h])
+
+# If both the C file and YACC are missing, the package cannot be build.
+AC_PROG_YACC
+AC_PATH_PROG([YACC_INST], $YACC)
+if test ! -f "$srcdir/xkbparse.c"; then
+   if test -z "$YACC_INST"; then
+      AC_MSG_ERROR([yacc not found - unable to compile xkbparse.y])
+   fi
+fi
+
+AC_CHECK_FUNCS([strdup strcasecmp])
+
+REQUIRED_MODULES="x11 xkbfile xproto >= 7.0.17"
+
+# Checks for pkg-config packages
+PKG_CHECK_MODULES(XKBCOMP, [$REQUIRED_MODULES])
+AC_SUBST(REQUIRED_MODULES)
+
+AC_ARG_WITH([xkb_config_root],
+    [AS_HELP_STRING([--with-xkb-config-root=<paths>],
+        [Set default XKB config root (default: ${datadir}/X11/xkb)])],
+    [XKBCONFIGROOT="$withval"],
+    [XKBCONFIGROOT='${datadir}/X11/xkb'])
+AC_SUBST([XKBCONFIGROOT])
+
+
+AC_CONFIG_FILES([
+       Makefile
+       man/Makefile
+       xkbcomp.pc])
+AC_OUTPUT
diff --git a/depcomp b/depcomp
new file mode 100755 (executable)
index 0000000..df8eea7
--- /dev/null
+++ b/depcomp
@@ -0,0 +1,630 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
+# Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by `PROGRAMS ARGS'.
+  object      Object file output by `PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputing dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+   # This is just like msvisualcpp but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u="sed s,\\\\\\\\,/,g"
+   depmode=msvisualcpp
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> "$depfile"
+    echo >> "$depfile"
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+    # That's a tab and a space in the [].
+    sed -e 's,^.*\.[a-z]*:[     ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+icc)
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using \ :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add `dependent.h:' lines.
+    sed -ne '2,${
+              s/^ *//
+              s/ \\*$//
+              s/$/:/
+              p
+            }' "$tmpdepfile" >> "$depfile"
+  else
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+   # The Tru64 compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      # With Tru64 cc, shared objects can also be used to make a
+      # static library.  This mechanism is used in libtool 1.4 series to
+      # handle both shared and static libraries in a single compilation.
+      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+      #
+      # With libtool 1.5 this exception was removed, and libtool now
+      # generates 2 separate objects for the 2 libraries.  These two
+      # compilations output dependencies in $dir.libs/$base.o.d and
+      # in $dir$base.o.d.  We have to check for both files, because
+      # one of the two compilations can be disabled.  We should prefer
+      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+      # automatically cleaned when .libs/ is deleted, while ignoring
+      # the former would cause a distcleancheck panic.
+      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
+      tmpdepfile2=$dir$base.o.d          # libtool 1.5
+      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
+      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1=$dir$base.o.d
+      tmpdepfile2=$dir$base.d
+      tmpdepfile3=$dir$base.d
+      tmpdepfile4=$dir$base.d
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+      exit $stat
+   fi
+
+   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+   do
+     test -f "$tmpdepfile" && break
+   done
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[   ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for `:'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+       set fnord "$@"
+       shift
+       shift
+       ;;
+    *)
+       set fnord "$@" "$arg"
+       shift
+       shift
+       ;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::     \1 \\:p' >> "$depfile"
+  echo "       " >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/expr.c b/expr.c
new file mode 100644 (file)
index 0000000..96fd956
--- /dev/null
+++ b/expr.c
@@ -0,0 +1,1065 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 "xkbcomp.h"
+#include "tokens.h"
+#include "expr.h"
+
+#include <ctype.h>
+
+/***====================================================================***/
+
+char *
+exprOpText(unsigned type)
+{
+    static char buf[32];
+
+    switch (type)
+    {
+    case ExprValue:
+        strcpy(buf, "literal");
+        break;
+    case ExprIdent:
+        strcpy(buf, "identifier");
+        break;
+    case ExprActionDecl:
+        strcpy(buf, "action declaration");
+        break;
+    case ExprFieldRef:
+        strcpy(buf, "field reference");
+        break;
+    case ExprArrayRef:
+        strcpy(buf, "array reference");
+        break;
+    case ExprKeysymList:
+        strcpy(buf, "list of keysyms");
+        break;
+    case ExprActionList:
+        strcpy(buf, "list of actions");
+        break;
+    case OpAdd:
+        strcpy(buf, "addition");
+        break;
+    case OpSubtract:
+        strcpy(buf, "subtraction");
+        break;
+    case OpMultiply:
+        strcpy(buf, "multiplication");
+        break;
+    case OpDivide:
+        strcpy(buf, "division");
+        break;
+    case OpAssign:
+        strcpy(buf, "assignment");
+        break;
+    case OpNot:
+        strcpy(buf, "logical not");
+        break;
+    case OpNegate:
+        strcpy(buf, "arithmetic negation");
+        break;
+    case OpInvert:
+        strcpy(buf, "bitwise inversion");
+        break;
+    case OpUnaryPlus:
+        strcpy(buf, "plus sign");
+        break;
+    default:
+        snprintf(buf, sizeof(buf), "illegal(%d)", type);
+        break;
+    }
+    return buf;
+}
+
+char *
+exprTypeText(unsigned type)
+{
+    static char buf[20];
+
+    switch (type)
+    {
+    case TypeUnknown:
+        strcpy(buf, "unknown");
+        break;
+    case TypeBoolean:
+        strcpy(buf, "boolean");
+        break;
+    case TypeInt:
+        strcpy(buf, "int");
+        break;
+    case TypeString:
+        strcpy(buf, "string");
+        break;
+    case TypeAction:
+        strcpy(buf, "action");
+        break;
+    case TypeKeyName:
+        strcpy(buf, "keyname");
+        break;
+    default:
+        snprintf(buf, sizeof(buf), "illegal(%d)", type);
+        break;
+    }
+    return buf;
+}
+
+int
+ExprResolveLhs(ExprDef * expr,
+               ExprResult * elem_rtrn,
+               ExprResult * field_rtrn, ExprDef ** index_rtrn)
+{
+    switch (expr->op)
+    {
+    case ExprIdent:
+        elem_rtrn->str = NULL;
+        field_rtrn->str = XkbAtomGetString(NULL, expr->value.str);
+        *index_rtrn = NULL;
+        return True;
+    case ExprFieldRef:
+        elem_rtrn->str = XkbAtomGetString(NULL, expr->value.field.element);
+        field_rtrn->str = XkbAtomGetString(NULL, expr->value.field.field);
+        *index_rtrn = NULL;
+        return True;
+    case ExprArrayRef:
+        elem_rtrn->str = XkbAtomGetString(NULL, expr->value.array.element);
+        field_rtrn->str = XkbAtomGetString(NULL, expr->value.array.field);
+        *index_rtrn = expr->value.array.entry;
+        return True;
+    }
+    WSGO1("Unexpected operator %d in ResolveLhs\n", expr->op);
+    return False;
+}
+
+Bool
+SimpleLookup(XPointer priv,
+             Atom elem, Atom field, unsigned type, ExprResult * val_rtrn)
+{
+    LookupEntry *entry;
+    register char *str;
+
+    if ((priv == NULL) ||
+        (field == None) || (elem != None) ||
+        ((type != TypeInt) && (type != TypeFloat)))
+    {
+        return False;
+    }
+    str = XkbAtomGetString(NULL, field);
+    for (entry = (LookupEntry *) priv;
+         (entry != NULL) && (entry->name != NULL); entry++)
+    {
+        if (uStrCaseCmp(str, entry->name) == 0)
+        {
+            val_rtrn->uval = entry->result;
+            if (type == TypeFloat)
+                val_rtrn->uval *= XkbGeomPtsPerMM;
+            return True;
+        }
+    }
+    return False;
+}
+
+Bool
+RadioLookup(XPointer priv,
+            Atom elem, Atom field, unsigned type, ExprResult * val_rtrn)
+{
+    register char *str;
+    int rg;
+
+    if ((field == None) || (elem != None) || (type != TypeInt))
+        return False;
+    str = XkbAtomGetString(NULL, field);
+    if (str)
+    {
+        if (uStrCasePrefix("group", str))
+            str += strlen("group");
+        else if (uStrCasePrefix("radiogroup", str))
+            str += strlen("radiogroup");
+        else if (uStrCasePrefix("rg", str))
+            str += strlen("rg");
+        else if (!isdigit(str[0]))
+            str = NULL;
+    }
+    if ((!str) || (sscanf(str, "%i", &rg) < 1) || (rg < 1)
+        || (rg > XkbMaxRadioGroups))
+        return False;
+    val_rtrn->uval = rg;
+    return True;
+}
+
+int
+TableLookup(XPointer priv,
+            Atom elem, Atom field, unsigned type, ExprResult * val_rtrn)
+{
+    LookupTable *tbl = (LookupTable *) priv;
+    register char *str;
+
+    if ((priv == NULL) || (field == None) || (type != TypeInt))
+        return False;
+    str = XkbAtomGetString(NULL, elem);
+    while (tbl)
+    {
+        if (((str == NULL) && (tbl->element == NULL)) ||
+            ((str != NULL) && (tbl->element != NULL) &&
+             (uStrCaseCmp(str, tbl->element) == 0)))
+        {
+            break;
+        }
+        tbl = tbl->nextElement;
+    }
+    if (tbl == NULL)            /* didn't find a matching element */
+        return False;
+    priv = (XPointer) tbl->entries;
+    return SimpleLookup(priv, (Atom) None, field, type, val_rtrn);
+}
+
+static LookupEntry modIndexNames[] = {
+    {"shift", ShiftMapIndex},
+    {"control", ControlMapIndex},
+    {"lock", LockMapIndex},
+    {"mod1", Mod1MapIndex},
+    {"mod2", Mod2MapIndex},
+    {"mod3", Mod3MapIndex},
+    {"mod4", Mod4MapIndex},
+    {"mod5", Mod5MapIndex},
+    {"none", XkbNoModifier},
+    {NULL, 0}
+};
+
+int
+LookupModIndex(XPointer priv,
+               Atom elem, Atom field, unsigned type, ExprResult * val_rtrn)
+{
+    return SimpleLookup((XPointer) modIndexNames, elem, field, type,
+                        val_rtrn);
+}
+
+int
+LookupModMask(XPointer priv,
+              Atom elem, Atom field, unsigned type, ExprResult * val_rtrn)
+{
+    char *str;
+
+    if ((elem != None) || (type != TypeInt))
+        return False;
+    str = XkbAtomGetString(NULL, field);
+    if (str == NULL)
+        return False;
+    if (uStrCaseCmp(str, "all") == 0)
+        val_rtrn->uval = 0xff;
+    else if (uStrCaseCmp(str, "none") == 0)
+        val_rtrn->uval = 0;
+    else if (LookupModIndex(priv, elem, field, type, val_rtrn))
+        val_rtrn->uval = (1 << val_rtrn->uval);
+    else if (priv != NULL)
+    {
+        LookupPriv *lpriv = (LookupPriv *) priv;
+        if ((lpriv->chain == NULL) ||
+            (!(*lpriv->chain) (lpriv->chainPriv, elem, field, type,
+                               val_rtrn)))
+            return False;
+    }
+    else
+        return False;
+    return True;
+}
+
+int
+ExprResolveModIndex(ExprDef * expr,
+                    ExprResult * val_rtrn,
+                    IdentLookupFunc lookup, XPointer lookupPriv)
+{
+    int ok = 0;
+    char *bogus = NULL;
+
+    switch (expr->op)
+    {
+    case ExprValue:
+        if (expr->type != TypeInt)
+        {
+            ERROR1
+                ("Found constant of type %s where a modifier mask was expected\n",
+                 exprTypeText(expr->type));
+            return False;
+        }
+        else if ((expr->value.ival >= XkbNumModifiers)
+                 || (expr->value.ival < 0))
+        {
+            ERROR2("Illegal modifier index (%d, must be 0..%d)\n",
+                   expr->value.ival, XkbNumModifiers - 1);
+            return False;
+        }
+        val_rtrn->ival = expr->value.ival;
+        return True;
+    case ExprIdent:
+        if (LookupModIndex(lookupPriv, (Atom) None, expr->value.str,
+                           (unsigned) TypeInt, val_rtrn))
+        {
+            return True;
+        }
+        if (lookup)
+        {
+            ok = (*lookup) (lookupPriv,
+                            None, expr->value.str, TypeInt, val_rtrn);
+        }
+        if (!ok)
+            ERROR1("Cannot determine modifier index for \"%s\"\n",
+                   XkbAtomText(NULL, expr->value.str, XkbMessage));
+        break;
+    case ExprFieldRef:
+        bogus = "field reference";
+        break;
+    case ExprArrayRef:
+        bogus = "array reference";
+        break;
+    case ExprActionDecl:
+        bogus = "function";
+        break;
+    case OpAdd:
+    case OpSubtract:
+    case OpMultiply:
+    case OpDivide:
+    case OpInvert:
+    case OpNegate:
+    case OpNot:
+    case OpUnaryPlus:
+        bogus = "arithmetic operations";
+        break;
+    case OpAssign:
+        bogus = "assignment";
+        break;
+    default:
+        WSGO1("Unknown operator %d in ResolveModIndex\n", expr->op);
+        return False;
+    }
+    if (bogus)
+    {
+        ERROR1("Modifier index must be a name or number, %s ignored\n",
+               bogus);
+        return False;
+    }
+    return ok;
+}
+
+int
+ExprResolveModMask(ExprDef * expr,
+                   ExprResult * val_rtrn,
+                   IdentLookupFunc lookup, XPointer lookupPriv)
+{
+    LookupPriv priv;
+
+    priv.priv = NULL;
+    priv.chain = lookup;
+    priv.chainPriv = lookupPriv;
+    return ExprResolveMask(expr, val_rtrn, LookupModMask, (XPointer) & priv);
+}
+
+int
+ExprResolveBoolean(ExprDef * expr,
+                   ExprResult * val_rtrn,
+                   IdentLookupFunc lookup, XPointer lookupPriv)
+{
+    int ok = 0;
+    char *bogus = NULL;
+
+    switch (expr->op)
+    {
+    case ExprValue:
+        if (expr->type != TypeBoolean)
+        {
+            ERROR1
+                ("Found constant of type %s where boolean was expected\n",
+                 exprTypeText(expr->type));
+            return False;
+        }
+        val_rtrn->ival = expr->value.ival;
+        return True;
+    case ExprIdent:
+        bogus = XkbAtomGetString(NULL, expr->value.str);
+        if (bogus)
+        {
+            if ((uStrCaseCmp(bogus, "true") == 0) ||
+                (uStrCaseCmp(bogus, "yes") == 0) ||
+                (uStrCaseCmp(bogus, "on") == 0))
+            {
+                val_rtrn->uval = 1;
+                return True;
+            }
+            else if ((uStrCaseCmp(bogus, "false") == 0) ||
+                     (uStrCaseCmp(bogus, "no") == 0) ||
+                     (uStrCaseCmp(bogus, "off") == 0))
+            {
+                val_rtrn->uval = 0;
+                return True;
+            }
+        }
+        if (lookup)
+        {
+            ok = (*lookup) (lookupPriv,
+                            None, expr->value.str, TypeBoolean, val_rtrn);
+        }
+        if (!ok)
+            ERROR1("Identifier \"%s\" of type int is unknown\n",
+                   XkbAtomText(NULL, expr->value.str, XkbMessage));
+        return ok;
+    case ExprFieldRef:
+        if (lookup)
+        {
+            ok = (*lookup) (lookupPriv,
+                            expr->value.field.element,
+                            expr->value.field.field, TypeBoolean, val_rtrn);
+        }
+        if (!ok)
+            ERROR2("Default \"%s.%s\" of type boolean is unknown\n",
+                   XkbAtomText(NULL, expr->value.field.element, XkbMessage),
+                   XkbAtomText(NULL, expr->value.field.field, XkbMessage));
+        return ok;
+    case OpInvert:
+    case OpNot:
+        ok = ExprResolveBoolean(expr, val_rtrn, lookup, lookupPriv);
+        if (ok)
+            val_rtrn->uval = !val_rtrn->uval;
+        return ok;
+    case OpAdd:
+        if (bogus == NULL)
+            bogus = "Addition";
+    case OpSubtract:
+        if (bogus == NULL)
+            bogus = "Subtraction";
+    case OpMultiply:
+        if (bogus == NULL)
+            bogus = "Multiplication";
+    case OpDivide:
+        if (bogus == NULL)
+            bogus = "Division";
+    case OpAssign:
+        if (bogus == NULL)
+            bogus = "Assignment";
+    case OpNegate:
+        if (bogus == NULL)
+            bogus = "Negation";
+        ERROR1("%s of boolean values not permitted\n", bogus);
+        break;
+    case OpUnaryPlus:
+        ERROR("Unary \"+\" operator not permitted for boolean values\n");
+        break;
+    default:
+        WSGO1("Unknown operator %d in ResolveBoolean\n", expr->op);
+        break;
+    }
+    return False;
+}
+
+int
+ExprResolveFloat(ExprDef * expr,
+                 ExprResult * val_rtrn,
+                 IdentLookupFunc lookup, XPointer lookupPriv)
+{
+    int ok = 0;
+    ExprResult leftRtrn, rightRtrn;
+    ExprDef *left, *right;
+
+    switch (expr->op)
+    {
+    case ExprValue:
+        if (expr->type == TypeString)
+        {
+            register char *str;
+            str = XkbAtomGetString(NULL, expr->value.str);
+            if ((str != NULL) && (strlen(str) == 1))
+            {
+                val_rtrn->uval = str[0] * XkbGeomPtsPerMM;
+                return True;
+            }
+        }
+        if ((expr->type != TypeInt) && (expr->type != TypeFloat))
+        {
+            ERROR1("Found constant of type %s, expected a number\n",
+                   exprTypeText(expr->type));
+            return False;
+        }
+        val_rtrn->ival = expr->value.ival;
+        if (expr->type == TypeInt)
+            val_rtrn->ival *= XkbGeomPtsPerMM;
+        return True;
+    case ExprIdent:
+        if (lookup)
+        {
+            ok = (*lookup) (lookupPriv,
+                            None, expr->value.str, TypeFloat, val_rtrn);
+        }
+        if (!ok)
+            ERROR1("Numeric identifier \"%s\" unknown\n",
+                   XkbAtomText(NULL, expr->value.str, XkbMessage));
+        return ok;
+    case ExprFieldRef:
+        if (lookup)
+        {
+            ok = (*lookup) (lookupPriv,
+                            expr->value.field.element,
+                            expr->value.field.field, TypeFloat, val_rtrn);
+        }
+        if (!ok)
+            ERROR2("Numeric default \"%s.%s\" unknown\n",
+                   XkbAtomText(NULL, expr->value.field.element, XkbMessage),
+                   XkbAtomText(NULL, expr->value.field.field, XkbMessage));
+        return ok;
+    case OpAdd:
+    case OpSubtract:
+    case OpMultiply:
+    case OpDivide:
+        left = expr->value.binary.left;
+        right = expr->value.binary.right;
+        if (ExprResolveFloat(left, &leftRtrn, lookup, lookupPriv) &&
+            ExprResolveFloat(right, &rightRtrn, lookup, lookupPriv))
+        {
+            switch (expr->op)
+            {
+            case OpAdd:
+                val_rtrn->ival = leftRtrn.ival + rightRtrn.ival;
+                break;
+            case OpSubtract:
+                val_rtrn->ival = leftRtrn.ival - rightRtrn.ival;
+                break;
+            case OpMultiply:
+                val_rtrn->ival = leftRtrn.ival * rightRtrn.ival;
+                break;
+            case OpDivide:
+                val_rtrn->ival = leftRtrn.ival / rightRtrn.ival;
+                break;
+            }
+            return True;
+        }
+        return False;
+    case OpAssign:
+        WSGO("Assignment operator not implemented yet\n");
+        break;
+    case OpNot:
+        left = expr->value.child;
+        if (ExprResolveFloat(left, &leftRtrn, lookup, lookupPriv))
+        {
+            ERROR("The ! operator cannot be applied to a number\n");
+        }
+        return False;
+    case OpInvert:
+    case OpNegate:
+        left = expr->value.child;
+        if (ExprResolveFloat(left, &leftRtrn, lookup, lookupPriv))
+        {
+            if (expr->op == OpNegate)
+                val_rtrn->ival = -leftRtrn.ival;
+            else
+                val_rtrn->ival = ~leftRtrn.ival;
+            return True;
+        }
+        return False;
+    case OpUnaryPlus:
+        left = expr->value.child;
+        return ExprResolveFloat(left, val_rtrn, lookup, lookupPriv);
+    default:
+        WSGO1("Unknown operator %d in ResolveFloat\n", expr->op);
+        break;
+    }
+    return False;
+}
+
+int
+ExprResolveInteger(ExprDef * expr,
+                   ExprResult * val_rtrn,
+                   IdentLookupFunc lookup, XPointer lookupPriv)
+{
+    int ok = 0;
+    ExprResult leftRtrn, rightRtrn;
+    ExprDef *left, *right;
+
+    switch (expr->op)
+    {
+    case ExprValue:
+        if (expr->type == TypeString)
+        {
+            register char *str;
+            str = XkbAtomGetString(NULL, expr->value.str);
+            if (str != NULL)
+                switch (strlen(str))
+                {
+                case 0:
+                    val_rtrn->uval = 0;
+                    return True;
+                case 1:
+                    val_rtrn->uval = str[0];
+                    return True;
+                default:
+                    break;
+                }
+        }
+        if ((expr->type != TypeInt) && (expr->type != TypeFloat))
+        {
+            ERROR1
+                ("Found constant of type %s where an int was expected\n",
+                 exprTypeText(expr->type));
+            return False;
+        }
+        val_rtrn->ival = expr->value.ival;
+        if (expr->type == TypeFloat)
+            val_rtrn->ival /= XkbGeomPtsPerMM;
+        return True;
+    case ExprIdent:
+        if (lookup)
+        {
+            ok = (*lookup) (lookupPriv,
+                            None, expr->value.str, TypeInt, val_rtrn);
+        }
+        if (!ok)
+            ERROR1("Identifier \"%s\" of type int is unknown\n",
+                   XkbAtomText(NULL, expr->value.str, XkbMessage));
+        return ok;
+    case ExprFieldRef:
+        if (lookup)
+        {
+            ok = (*lookup) (lookupPriv,
+                            expr->value.field.element,
+                            expr->value.field.field, TypeInt, val_rtrn);
+        }
+        if (!ok)
+            ERROR2("Default \"%s.%s\" of type int is unknown\n",
+                   XkbAtomText(NULL, expr->value.field.element, XkbMessage),
+                   XkbAtomText(NULL, expr->value.field.field, XkbMessage));
+        return ok;
+    case OpAdd:
+    case OpSubtract:
+    case OpMultiply:
+    case OpDivide:
+        left = expr->value.binary.left;
+        right = expr->value.binary.right;
+        if (ExprResolveInteger(left, &leftRtrn, lookup, lookupPriv) &&
+            ExprResolveInteger(right, &rightRtrn, lookup, lookupPriv))
+        {
+            switch (expr->op)
+            {
+            case OpAdd:
+                val_rtrn->ival = leftRtrn.ival + rightRtrn.ival;
+                break;
+            case OpSubtract:
+                val_rtrn->ival = leftRtrn.ival - rightRtrn.ival;
+                break;
+            case OpMultiply:
+                val_rtrn->ival = leftRtrn.ival * rightRtrn.ival;
+                break;
+            case OpDivide:
+                val_rtrn->ival = leftRtrn.ival / rightRtrn.ival;
+                break;
+            }
+            return True;
+        }
+        return False;
+    case OpAssign:
+        WSGO("Assignment operator not implemented yet\n");
+        break;
+    case OpNot:
+        left = expr->value.child;
+        if (ExprResolveInteger(left, &leftRtrn, lookup, lookupPriv))
+        {
+            ERROR("The ! operator cannot be applied to an integer\n");
+        }
+        return False;
+    case OpInvert:
+    case OpNegate:
+        left = expr->value.child;
+        if (ExprResolveInteger(left, &leftRtrn, lookup, lookupPriv))
+        {
+            if (expr->op == OpNegate)
+                val_rtrn->ival = -leftRtrn.ival;
+            else
+                val_rtrn->ival = ~leftRtrn.ival;
+            return True;
+        }
+        return False;
+    case OpUnaryPlus:
+        left = expr->value.child;
+        return ExprResolveInteger(left, val_rtrn, lookup, lookupPriv);
+    default:
+        WSGO1("Unknown operator %d in ResolveInteger\n", expr->op);
+        break;
+    }
+    return False;
+}
+
+int
+ExprResolveString(ExprDef * expr,
+                  ExprResult * val_rtrn,
+                  IdentLookupFunc lookup, XPointer lookupPriv)
+{
+    int ok = 0;
+    ExprResult leftRtrn, rightRtrn;
+    ExprDef *left;
+    ExprDef *right;
+    char *bogus = NULL;
+
+    switch (expr->op)
+    {
+    case ExprValue:
+        if (expr->type != TypeString)
+        {
+            ERROR1("Found constant of type %s, expected a string\n",
+                   exprTypeText(expr->type));
+            return False;
+        }
+        val_rtrn->str = XkbAtomGetString(NULL, expr->value.str);
+        if (val_rtrn->str == NULL)
+        {
+            static char *empty = "";
+            val_rtrn->str = empty;
+        }
+        return True;
+    case ExprIdent:
+        if (lookup)
+        {
+            ok = (*lookup) (lookupPriv,
+                            None, expr->value.str, TypeString, val_rtrn);
+        }
+        if (!ok)
+            ERROR1("Identifier \"%s\" of type string not found\n",
+                   XkbAtomText(NULL, expr->value.str, XkbMessage));
+        return ok;
+    case ExprFieldRef:
+        if (lookup)
+        {
+            ok = (*lookup) (lookupPriv,
+                            expr->value.field.element,
+                            expr->value.field.field, TypeString, val_rtrn);
+        }
+        if (!ok)
+            ERROR2("Default \"%s.%s\" of type string not found\n",
+                   XkbAtomText(NULL, expr->value.field.element, XkbMessage),
+                   XkbAtomText(NULL, expr->value.field.field, XkbMessage));
+        return ok;
+    case OpAdd:
+        left = expr->value.binary.left;
+        right = expr->value.binary.right;
+        if (ExprResolveString(left, &leftRtrn, lookup, lookupPriv) &&
+            ExprResolveString(right, &rightRtrn, lookup, lookupPriv))
+        {
+            int len;
+            char *new;
+            len = strlen(leftRtrn.str) + strlen(rightRtrn.str) + 1;
+            new = (char *) uAlloc(len);
+            if (new)
+            {
+                sprintf(new, "%s%s", leftRtrn.str, rightRtrn.str);
+                val_rtrn->str = new;
+                return True;
+            }
+        }
+        return False;
+    case OpSubtract:
+        if (bogus == NULL)
+            bogus = "Subtraction";
+    case OpMultiply:
+        if (bogus == NULL)
+            bogus = "Multiplication";
+    case OpDivide:
+        if (bogus == NULL)
+            bogus = "Division";
+    case OpAssign:
+        if (bogus == NULL)
+            bogus = "Assignment";
+    case OpNegate:
+        if (bogus == NULL)
+            bogus = "Negation";
+    case OpInvert:
+        if (bogus == NULL)
+            bogus = "Bitwise complement";
+        ERROR1("%s of string values not permitted\n", bogus);
+        return False;
+    case OpNot:
+        left = expr->value.child;
+        if (ExprResolveString(left, &leftRtrn, lookup, lookupPriv))
+        {
+            ERROR("The ! operator cannot be applied to a string\n");
+        }
+        return False;
+    case OpUnaryPlus:
+        left = expr->value.child;
+        if (ExprResolveString(left, &leftRtrn, lookup, lookupPriv))
+        {
+            ERROR("The + operator cannot be applied to a string\n");
+        }
+        return False;
+    default:
+        WSGO1("Unknown operator %d in ResolveString\n", expr->op);
+        break;
+    }
+    return False;
+}
+
+int
+ExprResolveKeyName(ExprDef * expr,
+                   ExprResult * val_rtrn,
+                   IdentLookupFunc lookup, XPointer lookupPriv)
+{
+    int ok = 0;
+    ExprDef *left;
+    ExprResult leftRtrn;
+    char *bogus = NULL;
+
+    switch (expr->op)
+    {
+    case ExprValue:
+        if (expr->type != TypeKeyName)
+        {
+            ERROR1("Found constant of type %s, expected a key name\n",
+                   exprTypeText(expr->type));
+            return False;
+        }
+        memcpy(val_rtrn->keyName.name, expr->value.keyName, XkbKeyNameLength);
+        return True;
+    case ExprIdent:
+        if (lookup)
+        {
+            ok = (*lookup) (lookupPriv,
+                            None, expr->value.str, TypeString, val_rtrn);
+        }
+        if (!ok)
+            ERROR1("Identifier \"%s\" of type string not found\n",
+                   XkbAtomText(NULL, expr->value.str, XkbMessage));
+        return ok;
+    case ExprFieldRef:
+        if (lookup)
+        {
+            ok = (*lookup) (lookupPriv,
+                            expr->value.field.element,
+                            expr->value.field.field, TypeString, val_rtrn);
+        }
+        if (!ok)
+            ERROR2("Default \"%s.%s\" of type key name not found\n",
+                   XkbAtomText(NULL, expr->value.field.element, XkbMessage),
+                   XkbAtomText(NULL, expr->value.field.field, XkbMessage));
+        return ok;
+    case OpAdd:
+        if (bogus == NULL)
+            bogus = "Addition";
+    case OpSubtract:
+        if (bogus == NULL)
+            bogus = "Subtraction";
+    case OpMultiply:
+        if (bogus == NULL)
+            bogus = "Multiplication";
+    case OpDivide:
+        if (bogus == NULL)
+            bogus = "Division";
+    case OpAssign:
+        if (bogus == NULL)
+            bogus = "Assignment";
+    case OpNegate:
+        if (bogus == NULL)
+            bogus = "Negation";
+    case OpInvert:
+        if (bogus == NULL)
+            bogus = "Bitwise complement";
+        ERROR1("%s of key name values not permitted\n", bogus);
+        return False;
+    case OpNot:
+        left = expr->value.binary.left;
+        if (ExprResolveString(left, &leftRtrn, lookup, lookupPriv))
+        {
+            ERROR("The ! operator cannot be applied to a key name\n");
+        }
+        return False;
+    case OpUnaryPlus:
+        left = expr->value.binary.left;
+        if (ExprResolveString(left, &leftRtrn, lookup, lookupPriv))
+        {
+            ERROR("The + operator cannot be applied to a key name\n");
+        }
+        return False;
+    default:
+        WSGO1("Unknown operator %d in ResolveKeyName\n", expr->op);
+        break;
+    }
+    return False;
+}
+
+/***====================================================================***/
+
+int
+ExprResolveEnum(ExprDef * expr, ExprResult * val_rtrn, LookupEntry * values)
+{
+    if (expr->op != ExprIdent)
+    {
+        ERROR1("Found a %s where an enumerated value was expected\n",
+               exprOpText(expr->op));
+        return False;
+    }
+    if (!SimpleLookup((XPointer) values, (Atom) None, expr->value.str,
+                      (unsigned) TypeInt, val_rtrn))
+    {
+        int nOut = 0;
+        ERROR1("Illegal identifier %s (expected one of: ",
+               XkbAtomText(NULL, expr->value.str, XkbMessage));
+        while (values && values->name)
+        {
+            if (nOut != 0)
+                INFO1(", %s", values->name);
+            else
+                INFO1("%s", values->name);
+            values++;
+            nOut++;
+        }
+        INFO(")\n");
+        return False;
+    }
+    return True;
+}
+
+int
+ExprResolveMask(ExprDef * expr,
+                ExprResult * val_rtrn,
+                IdentLookupFunc lookup, XPointer lookupPriv)
+{
+    int ok = 0;
+    ExprResult leftRtrn, rightRtrn;
+    ExprDef *left, *right;
+    char *bogus = NULL;
+
+    switch (expr->op)
+    {
+    case ExprValue:
+        if (expr->type != TypeInt)
+        {
+            ERROR1
+                ("Found constant of type %s where a mask was expected\n",
+                 exprTypeText(expr->type));
+            return False;
+        }
+        val_rtrn->ival = expr->value.ival;
+        return True;
+    case ExprIdent:
+        if (lookup)
+        {
+            ok = (*lookup) (lookupPriv,
+                            None, expr->value.str, TypeInt, val_rtrn);
+        }
+        if (!ok)
+            ERROR1("Identifier \"%s\" of type int is unknown\n",
+                   XkbAtomText(NULL, expr->value.str, XkbMessage));
+        return ok;
+    case ExprFieldRef:
+        if (lookup)
+        {
+            ok = (*lookup) (lookupPriv,
+                            expr->value.field.element,
+                            expr->value.field.field, TypeInt, val_rtrn);
+        }
+        if (!ok)
+            ERROR2("Default \"%s.%s\" of type int is unknown\n",
+                   XkbAtomText(NULL, expr->value.field.element, XkbMessage),
+                   XkbAtomText(NULL, expr->value.field.field, XkbMessage));
+        return ok;
+    case ExprArrayRef:
+        bogus = "array reference";
+    case ExprActionDecl:
+        if (bogus == NULL)
+            bogus = "function use";
+        ERROR1("Unexpected %s in mask expression\n", bogus);
+        ACTION("Expression ignored\n");
+        return False;
+    case OpAdd:
+    case OpSubtract:
+    case OpMultiply:
+    case OpDivide:
+        left = expr->value.binary.left;
+        right = expr->value.binary.right;
+        if (ExprResolveMask(left, &leftRtrn, lookup, lookupPriv) &&
+            ExprResolveMask(right, &rightRtrn, lookup, lookupPriv))
+        {
+            switch (expr->op)
+            {
+            case OpAdd:
+                val_rtrn->ival = leftRtrn.ival | rightRtrn.ival;
+                break;
+            case OpSubtract:
+                val_rtrn->ival = leftRtrn.ival & (~rightRtrn.ival);
+                break;
+            case OpMultiply:
+            case OpDivide:
+                ERROR1("Cannot %s masks\n",
+                       expr->op == OpDivide ? "divide" : "multiply");
+                ACTION("Illegal operation ignored\n");
+                return False;
+            }
+            return True;
+        }
+        return False;
+    case OpAssign:
+        WSGO("Assignment operator not implemented yet\n");
+        break;
+    case OpInvert:
+        left = expr->value.child;
+        if (ExprResolveInteger(left, &leftRtrn, lookup, lookupPriv))
+        {
+            val_rtrn->ival = ~leftRtrn.ival;
+            return True;
+        }
+        return False;
+    case OpUnaryPlus:
+    case OpNegate:
+    case OpNot:
+        left = expr->value.child;
+        if (ExprResolveInteger(left, &leftRtrn, lookup, lookupPriv))
+        {
+            ERROR1("The %s operator cannot be used with a mask\n",
+                   (expr->op == OpNegate ? "-" : "!"));
+        }
+        return False;
+    default:
+        WSGO1("Unknown operator %d in ResolveMask\n", expr->op);
+        break;
+    }
+    return False;
+}
+
+int
+ExprResolveKeySym(ExprDef * expr,
+                  ExprResult * val_rtrn,
+                  IdentLookupFunc lookup, XPointer lookupPriv)
+{
+    int ok = 0;
+    KeySym sym;
+
+    if (expr->op == ExprIdent)
+    {
+        char *str;
+        str = XkbAtomGetString(NULL, expr->value.str);
+        if ((str != NULL) && ((sym = XStringToKeysym(str)) != NoSymbol))
+        {
+            val_rtrn->uval = sym;
+            return True;
+        }
+    }
+    ok = ExprResolveInteger(expr, val_rtrn, lookup, lookupPriv);
+    if ((ok) && (val_rtrn->uval < 10))
+        val_rtrn->uval += '0';
+    return ok;
+}
diff --git a/expr.h b/expr.h
new file mode 100644 (file)
index 0000000..02519f9
--- /dev/null
+++ b/expr.h
@@ -0,0 +1,172 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 EXPR_H
+#define EXPR_H 1
+
+typedef union _ExprResult
+{
+    char *str;
+    int ival;
+    unsigned uval;
+    XkbKeyNameRec keyName;
+} ExprResult;
+
+typedef Bool(*IdentLookupFunc) (XPointer /* priv */ ,
+                                Atom /* elem */ ,
+                                Atom /* field */ ,
+                                unsigned /* type */ ,
+                                ExprResult *    /* val_rtrn */
+    );
+
+extern char *exprTypeText(unsigned      /* type */
+    );
+
+extern int ExprResolveLhs(ExprDef * /* expr */ ,
+                          ExprResult * /* elem_rtrn */ ,
+                          ExprResult * /* field_rtrn */ ,
+                          ExprDef **    /* index_rtrn */
+    );
+
+typedef struct _LookupPriv
+{
+    XPointer priv;
+    IdentLookupFunc chain;
+    XPointer chainPriv;
+} LookupPriv;
+
+typedef struct _LookupEntry
+{
+    const char *name;
+    unsigned result;
+} LookupEntry;
+
+typedef struct _LookupTable
+{
+    char *element;
+    LookupEntry *entries;
+    struct _LookupTable *nextElement;
+} LookupTable;
+
+
+extern char *exprOpText(unsigned        /* type */
+    );
+
+extern int RadioLookup(XPointer /* priv */ ,
+                       Atom /* elem */ ,
+                       Atom /* field */ ,
+                       unsigned /* type */ ,
+                       ExprResult *     /* val_rtrn */
+    );
+
+extern int SimpleLookup(XPointer /* priv */ ,
+                        Atom /* elem */ ,
+                        Atom /* field */ ,
+                        unsigned /* type */ ,
+                        ExprResult *    /* val_rtrn */
+    );
+
+extern int TableLookup(XPointer /* priv */ ,
+                       Atom /* elem */ ,
+                       Atom /* field */ ,
+                       unsigned /* type */ ,
+                       ExprResult *     /* val_rtrn */
+    );
+
+extern int LookupModIndex(XPointer /* priv */ ,
+                          Atom /* elem */ ,
+                          Atom /* field */ ,
+                          unsigned /* type */ ,
+                          ExprResult *  /* val_rtrn */
+    );
+
+extern int LookupModMask(XPointer /* priv */ ,
+                         Atom /* elem */ ,
+                         Atom /* field */ ,
+                         unsigned /* type */ ,
+                         ExprResult *   /* val_rtrn */
+    );
+
+extern int ExprResolveModIndex(ExprDef * /* expr */ ,
+                               ExprResult * /* val_rtrn */ ,
+                               IdentLookupFunc /* lookup */ ,
+                               XPointer /* lookupPriv */
+    );
+
+extern int ExprResolveModMask(ExprDef * /* expr */ ,
+                              ExprResult * /* val_rtrn */ ,
+                              IdentLookupFunc /* lookup */ ,
+                              XPointer  /* priv */
+    );
+
+extern int ExprResolveBoolean(ExprDef * /* expr */ ,
+                              ExprResult * /* val_rtrn */ ,
+                              IdentLookupFunc /* lookup */ ,
+                              XPointer  /* lookupPriv */
+    );
+
+extern int ExprResolveInteger(ExprDef * /* expr */ ,
+                              ExprResult * /* val_rtrn */ ,
+                              IdentLookupFunc /* lookup */ ,
+                              XPointer  /* lookupPriv */
+    );
+
+extern int ExprResolveFloat(ExprDef * /* expr */ ,
+                            ExprResult * /* val_rtrn */ ,
+                            IdentLookupFunc /* lookup */ ,
+                            XPointer    /* lookupPriv */
+    );
+
+extern int ExprResolveString(ExprDef * /* expr */ ,
+                             ExprResult * /* val_rtrn */ ,
+                             IdentLookupFunc /* lookup */ ,
+                             XPointer   /* lookupPriv */
+    );
+
+extern int ExprResolveKeyName(ExprDef * /* expr */ ,
+                              ExprResult * /* val_rtrn */ ,
+                              IdentLookupFunc /* lookup */ ,
+                              XPointer  /* lookupPriv */
+    );
+
+extern int ExprResolveEnum(ExprDef * /* expr */ ,
+                           ExprResult * /* val_rtrn */ ,
+                           LookupEntry *        /* values */
+    );
+
+extern int ExprResolveMask(ExprDef * /* expr */ ,
+                           ExprResult * /* val_rtrn */ ,
+                           IdentLookupFunc /* lookup */ ,
+                           XPointer     /* lookupPriv */
+    );
+
+extern int ExprResolveKeySym(ExprDef * /* expr */ ,
+                             ExprResult * /* val_rtrn */ ,
+                             IdentLookupFunc /* lookup */ ,
+                             XPointer   /* lookupPriv */
+    );
+
+#endif /* EXPR_H */
diff --git a/geometry.c b/geometry.c
new file mode 100644 (file)
index 0000000..7f65c3a
--- /dev/null
@@ -0,0 +1,3768 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 "xkbcomp.h"
+#include "tokens.h"
+#include "expr.h"
+#include "vmod.h"
+#include "misc.h"
+#include "indicators.h"
+#include "action.h"
+#include "keycodes.h"
+#include "alias.h"
+
+#include "X11/extensions/XKBgeom.h"
+
+#define        DFLT_FONT       "helvetica"
+#define        DFLT_SLANT      "r"
+#define        DFLT_WEIGHT     "medium"
+#define        DFLT_SET_WIDTH  "normal"
+#define        DFLT_VARIANT    ""
+#define        DFLT_ENCODING   "iso8859-1"
+#define        DFLT_SIZE       120
+
+typedef struct _PropertyInfo
+{
+    CommonInfo defs;
+    char *name;
+    char *value;
+} PropertyInfo;
+
+#define        _GSh_Outlines   (1<<1)
+#define        _GSh_Approx     (1<<2)
+#define        _GSh_Primary    (1<<3)
+typedef struct _ShapeInfo
+{
+    CommonInfo defs;
+    Atom name;
+    short index;
+    unsigned short nOutlines;
+    unsigned short szOutlines;
+    XkbOutlinePtr outlines;
+    XkbOutlinePtr approx;
+    XkbOutlinePtr primary;
+    int dfltCornerRadius;
+} ShapeInfo;
+
+#define        shText(d,s)     \
+               ((s)?XkbAtomText((d),(s)->name,XkbMessage):"default shape")
+
+#define        _GD_Priority    (1<<0)
+#define        _GD_Top         (1<<1)
+#define        _GD_Left        (1<<2)
+#define        _GD_Angle       (1<<3)
+#define        _GD_Shape       (1<<4)
+#define        _GD_FontVariant (1<<4)  /* CHEATING */
+#define        _GD_Corner      (1<<5)
+#define        _GD_Width       (1<<5)  /* CHEATING */
+#define        _GD_Color       (1<<6)
+#define        _GD_OffColor    (1<<7)
+#define        _GD_Height      (1<<7)  /* CHEATING */
+#define        _GD_Text        (1<<8)
+#define        _GD_Font        (1<<9)
+#define        _GD_FontSlant   (1<<10)
+#define        _GD_FontWeight  (1<<11)
+#define        _GD_FontSetWidth (1<<12)
+#define        _GD_FontSize    (1<<13)
+#define        _GD_FontEncoding (1<<14)
+#define        _GD_FontSpec    (1<<15)
+
+
+#define        _GD_FontParts   (_GD_Font|_GD_FontSlant|_GD_FontWeight|_GD_FontSetWidth|_GD_FontSize|_GD_FontEncoding|_GD_FontVariant)
+
+typedef struct _DoodadInfo
+{
+    CommonInfo defs;
+    Atom name;
+    unsigned char type;
+    unsigned char priority;
+    short top;
+    short left;
+    short angle;
+    unsigned short corner;
+    unsigned short width;
+    unsigned short height;
+    Atom shape;
+    Atom color;
+    Atom offColor;
+    Atom text;
+    Atom font;
+    Atom fontSlant;
+    Atom fontWeight;
+    Atom fontSetWidth;
+    Atom fontVariant;
+    unsigned short fontSize;
+    Atom fontEncoding;
+    Atom fontSpec;
+    char *logoName;
+    struct _SectionInfo *section;
+} DoodadInfo;
+
+#define        Yes             1
+#define        No              0
+#define        Undefined       -1
+
+#define        _GK_Default     (1<<0)
+#define        _GK_Name        (1<<1)
+#define        _GK_Gap         (1<<2)
+#define        _GK_Shape       (1<<3)
+#define        _GK_Color       (1<<4)
+typedef struct _KeyInfo
+{
+    CommonInfo defs;
+    char name[8];
+    short gap;
+    short index;
+    Atom shape;
+    Atom color;
+    struct _RowInfo *row;
+} KeyInfo;
+#define        keyText(k)      ((k)&&(k)->name[0]?(k)->name:"default")
+
+#define        _GR_Default     (1<<0)
+#define        _GR_Vertical    (1<<1)
+#define        _GR_Top         (1<<2)
+#define        _GR_Left        (1<<3)
+typedef struct _RowInfo
+{
+    CommonInfo defs;
+    unsigned short top;
+    unsigned short left;
+    short index;
+    Bool vertical;
+    unsigned short nKeys;
+    KeyInfo *keys;
+    KeyInfo dfltKey;
+    struct _SectionInfo *section;
+} RowInfo;
+#define        rowText(d,r)    \
+       ((r)?XkbAtomText((d),(r)->section->name,XkbMessage):"default")
+
+#define        _GOK_UnknownRow -1
+typedef struct _OverlayKeyInfo
+{
+    CommonInfo defs;
+    short sectionRow;
+    short overlayRow;
+    char over[XkbKeyNameLength + 1];
+    char under[XkbKeyNameLength + 1];
+} OverlayKeyInfo;
+
+typedef struct _OverlayInfo
+{
+    CommonInfo defs;
+    Atom name;
+    unsigned short nRows;
+    unsigned short nKeys;
+    OverlayKeyInfo *keys;
+} OverlayInfo;
+
+
+#define        _GS_Default     (1<<0)
+#define        _GS_Name        (1<<1)
+#define        _GS_Top         (1<<2)
+#define        _GS_Left        (1<<3)
+#define        _GS_Width       (1<<4)
+#define        _GS_Height      (1<<5)
+#define        _GS_Angle       (1<<6)
+#define        _GS_Priority    (1<<7)
+typedef struct _SectionInfo
+{
+    CommonInfo defs;
+    Atom name;
+    unsigned short top;
+    unsigned short left;
+    unsigned short width;
+    unsigned short height;
+    unsigned short angle;
+    unsigned short nRows;
+    unsigned short nDoodads;
+    unsigned short nOverlays;
+    unsigned char priority;
+    unsigned char nextDoodadPriority;
+    RowInfo *rows;
+    DoodadInfo *doodads;
+    RowInfo dfltRow;
+    DoodadInfo *dfltDoodads;
+    OverlayInfo *overlays;
+    struct _GeometryInfo *geometry;
+} SectionInfo;
+#define        scText(d,s)     ((s)?XkbAtomText((d),(s)->name,XkbMessage):"default")
+
+typedef struct _GeometryInfo
+{
+    char *name;
+    Display *dpy;
+    unsigned fileID;
+    unsigned merge;
+    int errorCount;
+    unsigned nextPriority;
+    int nProps;
+    int nShapes;
+    int nSections;
+    int nDoodads;
+    PropertyInfo *props;
+    ShapeInfo *shapes;
+    SectionInfo *sections;
+    DoodadInfo *doodads;
+    int widthMM;
+    int heightMM;
+    Atom font;
+    Atom fontSlant;
+    Atom fontWeight;
+    Atom fontSetWidth;
+    Atom fontVariant;
+    unsigned fontSize;
+    Atom fontEncoding;
+    Atom fontSpec;
+    Atom baseColor;
+    Atom labelColor;
+    int dfltCornerRadius;
+    SectionInfo dfltSection;
+    DoodadInfo *dfltDoodads;
+    AliasInfo *aliases;
+} GeometryInfo;
+
+static char *
+ddText(Display * dpy, DoodadInfo * di)
+{
+    static char buf[64];
+
+    if (di == NULL)
+    {
+        strcpy(buf, "default");
+        return buf;
+    }
+    if (di->section)
+    {
+        sprintf(buf, "%s in section %s",
+                XkbAtomText(dpy, di->name, XkbMessage), scText(dpy,
+                                                               di->section));
+        return buf;
+    }
+    return XkbAtomText(dpy, di->name, XkbMessage);
+}
+
+/***====================================================================***/
+
+static void
+InitPropertyInfo(PropertyInfo * pi, GeometryInfo * info)
+{
+    pi->defs.defined = 0;
+    pi->defs.fileID = info->fileID;
+    pi->defs.merge = info->merge;
+    pi->name = pi->value = NULL;
+    return;
+}
+
+static void
+FreeProperties(PropertyInfo * pi, GeometryInfo * info)
+{
+    PropertyInfo *tmp;
+    PropertyInfo *next;
+
+    if (info->props == pi)
+    {
+        info->props = NULL;
+        info->nProps = 0;
+    }
+    for (tmp = pi; tmp != NULL; tmp = next)
+    {
+        if (tmp->name)
+            uFree(tmp->name);
+        if (tmp->value)
+            uFree(tmp->value);
+        tmp->name = tmp->value = NULL;
+        next = (PropertyInfo *) tmp->defs.next;
+        uFree(tmp);
+    }
+    return;
+}
+
+static void
+InitKeyInfo(KeyInfo * key, RowInfo * row, GeometryInfo * info)
+{
+
+    if (key != &row->dfltKey)
+    {
+        *key = row->dfltKey;
+        strcpy(key->name, "unknown");
+        key->defs.defined &= ~_GK_Default;
+    }
+    else
+    {
+        bzero(key, sizeof(KeyInfo));
+        strcpy(key->name, "default");
+        key->defs.defined = _GK_Default;
+        key->defs.fileID = info->fileID;
+        key->defs.merge = info->merge;
+        key->defs.next = NULL;
+        key->row = row;
+    }
+    return;
+}
+
+static void
+ClearKeyInfo(KeyInfo * key)
+{
+    key->defs.defined &= ~_GK_Default;
+    strcpy(key->name, "default");
+    key->gap = 0;
+    key->shape = None;
+    key->color = None;
+    return;
+}
+
+static void
+FreeKeys(KeyInfo * key, RowInfo * row, GeometryInfo * info)
+{
+    KeyInfo *tmp;
+    KeyInfo *next;
+
+    if (row->keys == key)
+    {
+        row->nKeys = 0;
+        row->keys = NULL;
+    }
+    for (tmp = key; tmp != NULL; tmp = next)
+    {
+        ClearKeyInfo(tmp);
+        next = (KeyInfo *) tmp->defs.next;
+        uFree(tmp);
+    }
+    return;
+}
+
+static void
+InitRowInfo(RowInfo * row, SectionInfo * section, GeometryInfo * info)
+{
+    if (row != &section->dfltRow)
+    {
+        *row = section->dfltRow;
+        row->defs.defined &= ~_GR_Default;
+    }
+    else
+    {
+        bzero(row, sizeof(*row));
+        row->defs.defined = _GR_Default;
+        row->defs.fileID = info->fileID;
+        row->defs.merge = info->merge;
+        row->defs.next = NULL;
+        row->section = section;
+        row->nKeys = 0;
+        row->keys = NULL;
+        InitKeyInfo(&row->dfltKey, row, info);
+    }
+    return;
+}
+
+static void
+ClearRowInfo(RowInfo * row, GeometryInfo * info)
+{
+    row->defs.defined &= ~_GR_Default;
+    row->top = row->left = 0;
+    row->vertical = False;
+    row->nKeys = 0;
+    if (row->keys)
+        FreeKeys(row->keys, row, info);
+    ClearKeyInfo(&row->dfltKey);
+    row->dfltKey.defs.defined |= _GK_Default;
+    return;
+}
+
+static void
+FreeRows(RowInfo * row, SectionInfo * section, GeometryInfo * info)
+{
+    RowInfo *next;
+    RowInfo *tmp;
+
+    if (row == section->rows)
+    {
+        section->nRows = 0;
+        section->rows = NULL;
+    }
+    for (tmp = row; tmp != NULL; tmp = next)
+    {
+        ClearRowInfo(tmp, info);
+        next = (RowInfo *) tmp->defs.next;
+        uFree(tmp);
+    }
+    return;
+}
+
+static DoodadInfo *
+FindDoodadByType(DoodadInfo * di, unsigned type)
+{
+    while (di)
+    {
+        if (di->type == type)
+            return di;
+        di = (DoodadInfo *) di->defs.next;
+    }
+    return NULL;
+}
+
+static DoodadInfo *
+FindDoodadByName(DoodadInfo * di, Atom name)
+{
+    while (di)
+    {
+        if (di->name == name)
+            return di;
+        di = (DoodadInfo *) di->defs.next;
+    }
+    return NULL;
+}
+
+static void
+InitDoodadInfo(DoodadInfo * di, unsigned type, SectionInfo * si,
+               GeometryInfo * info)
+{
+    DoodadInfo *dflt;
+
+    dflt = NULL;
+    if (si && si->dfltDoodads)
+        dflt = FindDoodadByType(si->dfltDoodads, type);
+    if ((dflt == NULL) && (info->dfltDoodads))
+        dflt = FindDoodadByType(info->dfltDoodads, type);
+    if (dflt != NULL)
+    {
+        *di = *dflt;
+        di->defs.next = NULL;
+    }
+    else
+    {
+        bzero(di, sizeof(DoodadInfo));
+        di->defs.fileID = info->fileID;
+        di->type = type;
+    }
+    di->section = si;
+    if (si != NULL)
+    {
+        di->priority = si->nextDoodadPriority++;
+#if XkbGeomMaxPriority < 255
+        if (si->nextDoodadPriority > XkbGeomMaxPriority)
+            si->nextDoodadPriority = XkbGeomMaxPriority;
+#endif
+    }
+    else
+    {
+        di->priority = info->nextPriority++;
+        if (info->nextPriority > XkbGeomMaxPriority)
+            info->nextPriority = XkbGeomMaxPriority;
+    }
+    return;
+}
+
+static void
+ClearDoodadInfo(DoodadInfo * di)
+{
+    CommonInfo defs;
+
+    defs = di->defs;
+    bzero(di, sizeof(DoodadInfo));
+    di->defs = defs;
+    di->defs.defined = 0;
+    return;
+}
+
+static void
+ClearOverlayInfo(OverlayInfo * ol)
+{
+    if (ol && ol->keys)
+    {
+        ol->keys = (OverlayKeyInfo *) ClearCommonInfo(&ol->keys->defs);
+        ol->nKeys = 0;
+    }
+    return;
+}
+
+static void
+FreeDoodads(DoodadInfo * di, SectionInfo * si, GeometryInfo * info)
+{
+    DoodadInfo *tmp;
+    DoodadInfo *next;
+
+    if (si)
+    {
+        if (si->doodads == di)
+        {
+            si->doodads = NULL;
+            si->nDoodads = 0;
+        }
+        if (si->dfltDoodads == di)
+            si->dfltDoodads = NULL;
+    }
+    if (info->doodads == di)
+    {
+        info->doodads = NULL;
+        info->nDoodads = 0;
+    }
+    if (info->dfltDoodads == di)
+        info->dfltDoodads = NULL;
+    for (tmp = di; tmp != NULL; tmp = next)
+    {
+        next = (DoodadInfo *) tmp->defs.next;
+        ClearDoodadInfo(tmp);
+        uFree(tmp);
+    }
+    return;
+}
+
+static void
+InitSectionInfo(SectionInfo * si, GeometryInfo * info)
+{
+    if (si != &info->dfltSection)
+    {
+        *si = info->dfltSection;
+        si->defs.defined &= ~_GS_Default;
+        si->name = XkbInternAtom(info->dpy, "unknown", False);
+        si->priority = info->nextPriority++;
+        if (info->nextPriority > XkbGeomMaxPriority)
+            info->nextPriority = XkbGeomMaxPriority;
+    }
+    else
+    {
+        bzero(si, sizeof(SectionInfo));
+        si->defs.fileID = info->fileID;
+        si->defs.merge = info->merge;
+        si->defs.next = NULL;
+        si->geometry = info;
+        si->name = XkbInternAtom(info->dpy, "default", False);
+        InitRowInfo(&si->dfltRow, si, info);
+    }
+    return;
+}
+
+static void
+DupSectionInfo(SectionInfo * into, SectionInfo * from, GeometryInfo * info)
+{
+    CommonInfo defs;
+
+    defs = into->defs;
+    *into = *from;
+    into->defs.fileID = defs.fileID;
+    into->defs.merge = defs.merge;
+    into->defs.next = NULL;
+    into->dfltRow.defs.fileID = defs.fileID;
+    into->dfltRow.defs.merge = defs.merge;
+    into->dfltRow.defs.next = NULL;
+    into->dfltRow.section = into;
+    into->dfltRow.dfltKey.defs.fileID = defs.fileID;
+    into->dfltRow.dfltKey.defs.merge = defs.merge;
+    into->dfltRow.dfltKey.defs.next = NULL;
+    into->dfltRow.dfltKey.row = &into->dfltRow;
+    return;
+}
+
+static void
+ClearSectionInfo(SectionInfo * si, GeometryInfo * info)
+{
+
+    si->defs.defined &= ~_GS_Default;
+    si->name = XkbInternAtom(info->dpy, "default", False);
+    si->top = si->left = 0;
+    si->width = si->height = 0;
+    si->angle = 0;
+    if (si->rows)
+    {
+        FreeRows(si->rows, si, info);
+        si->rows = NULL;
+    }
+    ClearRowInfo(&si->dfltRow, info);
+    if (si->doodads)
+    {
+        FreeDoodads(si->doodads, si, info);
+        si->doodads = NULL;
+    }
+    si->dfltRow.defs.defined = _GR_Default;
+    return;
+}
+
+static void
+FreeSections(SectionInfo * si, GeometryInfo * info)
+{
+    SectionInfo *tmp;
+    SectionInfo *next;
+
+    if (si == info->sections)
+    {
+        info->nSections = 0;
+        info->sections = NULL;
+    }
+    for (tmp = si; tmp != NULL; tmp = next)
+    {
+        ClearSectionInfo(tmp, info);
+        next = (SectionInfo *) tmp->defs.next;
+        uFree(tmp);
+    }
+    return;
+}
+
+static void
+FreeShapes(ShapeInfo * si, GeometryInfo * info)
+{
+    ShapeInfo *tmp;
+    ShapeInfo *next;
+
+    if (si == info->shapes)
+    {
+        info->nShapes = 0;
+        info->shapes = NULL;
+    }
+    for (tmp = si; tmp != NULL; tmp = next)
+    {
+        if (tmp->outlines)
+        {
+            register int i;
+            for (i = 0; i < tmp->nOutlines; i++)
+            {
+                if (tmp->outlines[i].points != NULL)
+                {
+                    uFree(tmp->outlines[i].points);
+                    tmp->outlines[i].num_points = 0;
+                    tmp->outlines[i].points = NULL;
+                }
+            }
+            uFree(tmp->outlines);
+            tmp->szOutlines = 0;
+            tmp->nOutlines = 0;
+            tmp->outlines = NULL;
+            tmp->primary = tmp->approx = NULL;
+        }
+        next = (ShapeInfo *) tmp->defs.next;
+        uFree(tmp);
+    }
+    return;
+}
+
+/***====================================================================***/
+
+static void
+InitGeometryInfo(GeometryInfo * info, unsigned fileID, unsigned merge)
+{
+    bzero(info, sizeof(GeometryInfo));
+    info->fileID = fileID;
+    info->merge = merge;
+    InitSectionInfo(&info->dfltSection, info);
+    info->dfltSection.defs.defined = _GS_Default;
+    return;
+}
+
+static void
+ClearGeometryInfo(GeometryInfo * info)
+{
+    if (info->name)
+        uFree(info->name);
+    info->name = NULL;
+    if (info->props)
+        FreeProperties(info->props, info);
+    if (info->shapes)
+        FreeShapes(info->shapes, info);
+    if (info->sections)
+        FreeSections(info->sections, info);
+    info->widthMM = 0;
+    info->heightMM = 0;
+    info->dfltCornerRadius = 0;
+    ClearSectionInfo(&info->dfltSection, info);
+    info->dfltSection.defs.defined = _GS_Default;
+    if (info->aliases)
+        ClearAliases(&info->aliases);
+    return;
+}
+
+/***====================================================================***/
+
+static PropertyInfo *
+NextProperty(GeometryInfo * info)
+{
+    PropertyInfo *pi;
+
+    pi = uTypedAlloc(PropertyInfo);
+    if (pi)
+    {
+        bzero((char *) pi, sizeof(PropertyInfo));
+        info->props = (PropertyInfo *) AddCommonInfo(&info->props->defs,
+                                                     (CommonInfo *) pi);
+        info->nProps++;
+    }
+    return pi;
+}
+
+static PropertyInfo *
+FindProperty(GeometryInfo * info, char *name)
+{
+    PropertyInfo *old;
+
+    if (!name)
+        return NULL;
+    for (old = info->props; old != NULL;
+         old = (PropertyInfo *) old->defs.next)
+    {
+        if ((old->name) && (uStringEqual(name, old->name)))
+            return old;
+    }
+    return NULL;
+}
+
+static Bool
+AddProperty(GeometryInfo * info, PropertyInfo * new)
+{
+    PropertyInfo *old;
+
+    if ((!new) || (!new->value) || (!new->name))
+        return False;
+    old = FindProperty(info, new->name);
+    if (old != NULL)
+    {
+        if ((new->defs.merge == MergeReplace)
+            || (new->defs.merge == MergeOverride))
+        {
+            if (((old->defs.fileID == new->defs.fileID)
+                 && (warningLevel > 0)) || (warningLevel > 9))
+            {
+                WARN1("Multiple definitions for the \"%s\" property\n",
+                      new->name);
+                ACTION2("Ignoring \"%s\", using \"%s\"\n", old->value,
+                        new->value);
+            }
+            if (old->value)
+                uFree(old->value);
+            old->value = uStringDup(new->value);
+            return True;
+        }
+        if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0))
+            || (warningLevel > 9))
+        {
+            WARN1("Multiple definitions for \"%s\" property\n", new->name);
+            ACTION2("Using \"%s\", ignoring \"%s\" \n", old->value,
+                    new->value);
+        }
+        return True;
+    }
+    old = new;
+    if ((new = NextProperty(info)) == NULL)
+        return False;
+    new->defs.next = NULL;
+    new->name = uStringDup(old->name);
+    new->value = uStringDup(old->value);
+    return True;
+}
+
+/***====================================================================***/
+
+static ShapeInfo *
+NextShape(GeometryInfo * info)
+{
+    ShapeInfo *si;
+
+    si = uTypedAlloc(ShapeInfo);
+    if (si)
+    {
+        bzero((char *) si, sizeof(ShapeInfo));
+        info->shapes = (ShapeInfo *) AddCommonInfo(&info->shapes->defs,
+                                                   (CommonInfo *) si);
+        info->nShapes++;
+        si->dfltCornerRadius = info->dfltCornerRadius;
+    }
+    return si;
+}
+
+static ShapeInfo *
+FindShape(GeometryInfo * info, Atom name, const char *type, const char *which)
+{
+    ShapeInfo *old;
+
+    for (old = info->shapes; old != NULL; old = (ShapeInfo *) old->defs.next)
+    {
+        if (name == old->name)
+            return old;
+    }
+    if (type != NULL)
+    {
+        old = info->shapes;
+        WARN3("Unknown shape \"%s\" for %s %s\n",
+              XkbAtomText(info->dpy, name, XkbMessage), type, which);
+        if (old)
+        {
+            ACTION1("Using default shape %s instead\n",
+                    shText(info->dpy, old));
+            return old;
+        }
+        ACTION("No default shape; definition ignored\n");
+        return NULL;
+    }
+    return NULL;
+}
+
+static Bool
+AddShape(GeometryInfo * info, ShapeInfo * new)
+{
+    ShapeInfo *old;
+
+    old = FindShape(info, new->name, NULL, NULL);
+    if (old != NULL)
+    {
+        if ((new->defs.merge == MergeReplace)
+            || (new->defs.merge == MergeOverride))
+        {
+            ShapeInfo *next = (ShapeInfo *) old->defs.next;
+            if (((old->defs.fileID == new->defs.fileID)
+                 && (warningLevel > 0)) || (warningLevel > 9))
+            {
+                WARN1("Duplicate shape name \"%s\"\n",
+                      shText(info->dpy, old));
+                ACTION("Using last definition\n");
+            }
+            *old = *new;
+            old->defs.next = &next->defs;
+            return True;
+        }
+        if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0))
+            || (warningLevel > 9))
+        {
+            WARN1("Multiple shapes named \"%s\"\n", shText(info->dpy, old));
+            ACTION("Using first definition\n");
+        }
+        return True;
+    }
+    old = new;
+    if ((new = NextShape(info)) == NULL)
+        return False;
+    *new = *old;
+    new->defs.next = NULL;
+    old->szOutlines = old->nOutlines = 0;
+    old->outlines = NULL;
+    old->approx = NULL;
+    old->primary = NULL;
+    return True;
+}
+
+/***====================================================================***/
+
+static void
+ReplaceDoodad(DoodadInfo * into, DoodadInfo * from)
+{
+    CommonInfo *next;
+
+    next = into->defs.next;
+    ClearDoodadInfo(into);
+    *into = *from;
+    into->defs.next = next;
+    next = from->defs.next;
+    ClearDoodadInfo(from);
+    from->defs.next = next;
+    return;
+}
+
+static DoodadInfo *
+NextDfltDoodad(SectionInfo * si, GeometryInfo * info)
+{
+    DoodadInfo *di;
+
+    di = uTypedCalloc(1, DoodadInfo);
+    if (!di)
+        return NULL;
+    if (si)
+    {
+        si->dfltDoodads =
+            (DoodadInfo *) AddCommonInfo(&si->dfltDoodads->defs,
+                                         (CommonInfo *) di);
+    }
+    else
+    {
+        info->dfltDoodads =
+            (DoodadInfo *) AddCommonInfo(&info->dfltDoodads->defs,
+                                         (CommonInfo *) di);
+    }
+    return di;
+}
+
+static DoodadInfo *
+NextDoodad(SectionInfo * si, GeometryInfo * info)
+{
+    DoodadInfo *di;
+
+    di = uTypedCalloc(1, DoodadInfo);
+    if (di)
+    {
+        if (si)
+        {
+            si->doodads = (DoodadInfo *) AddCommonInfo(&si->doodads->defs,
+                                                       (CommonInfo *) di);
+            si->nDoodads++;
+        }
+        else
+        {
+            info->doodads =
+                (DoodadInfo *) AddCommonInfo(&info->doodads->defs,
+                                             (CommonInfo *) di);
+            info->nDoodads++;
+        }
+    }
+    return di;
+}
+
+static Bool
+AddDoodad(SectionInfo * si, GeometryInfo * info, DoodadInfo * new)
+{
+    DoodadInfo *old;
+
+    old = FindDoodadByName((si ? si->doodads : info->doodads), new->name);
+    if (old != NULL)
+    {
+        if ((new->defs.merge == MergeReplace)
+            || (new->defs.merge == MergeOverride))
+        {
+            if (((old->defs.fileID == new->defs.fileID)
+                 && (warningLevel > 0)) || (warningLevel > 9))
+            {
+                WARN1("Multiple doodads named \"%s\"\n",
+                      XkbAtomText(info->dpy, old->name, XkbMessage));
+                ACTION("Using last definition\n");
+            }
+            ReplaceDoodad(old, new);
+            old->section = si;
+            return True;
+        }
+        if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0))
+            || (warningLevel > 9))
+        {
+            WARN1("Multiple doodads named \"%s\"\n",
+                  XkbAtomText(info->dpy, old->name, XkbMessage));
+            ACTION("Using first definition\n");
+        }
+        return True;
+    }
+    old = new;
+    if ((new = NextDoodad(si, info)) == NULL)
+        return False;
+    ReplaceDoodad(new, old);
+    new->section = si;
+    new->defs.next = NULL;
+    return True;
+}
+
+static DoodadInfo *
+FindDfltDoodadByTypeName(char *name, SectionInfo * si, GeometryInfo * info)
+{
+    DoodadInfo *dflt;
+    unsigned type;
+
+    if (uStrCaseCmp(name, "outline") == 0)
+        type = XkbOutlineDoodad;
+    else if (uStrCaseCmp(name, "solid") == 0)
+        type = XkbSolidDoodad;
+    else if (uStrCaseCmp(name, "text") == 0)
+        type = XkbTextDoodad;
+    else if (uStrCaseCmp(name, "indicator") == 0)
+        type = XkbIndicatorDoodad;
+    else if (uStrCaseCmp(name, "logo") == 0)
+        type = XkbLogoDoodad;
+    else
+        return NULL;
+    if ((si) && (si->dfltDoodads))
+        dflt = FindDoodadByType(si->dfltDoodads, type);
+    else
+        dflt = NULL;
+    if ((!dflt) && (info->dfltDoodads))
+        dflt = FindDoodadByType(info->dfltDoodads, type);
+    if (dflt == NULL)
+    {
+        dflt = NextDfltDoodad(si, info);
+        if (dflt != NULL)
+        {
+            dflt->name = None;
+            dflt->type = type;
+        }
+    }
+    return dflt;
+}
+
+/***====================================================================***/
+
+static Bool
+AddOverlay(SectionInfo * si, GeometryInfo * info, OverlayInfo * new)
+{
+    OverlayInfo *old;
+
+    for (old = si->overlays; old != NULL;
+         old = (OverlayInfo *) old->defs.next)
+    {
+        if (old->name == new->name)
+            break;
+    }
+    if (old != NULL)
+    {
+        if ((new->defs.merge == MergeReplace)
+            || (new->defs.merge == MergeOverride))
+        {
+            if (((old->defs.fileID == new->defs.fileID)
+                 && (warningLevel > 0)) || (warningLevel > 9))
+            {
+                WARN2
+                    ("Multiple overlays named \"%s\" for section \"%s\"\n",
+                     XkbAtomText(info->dpy, old->name, XkbMessage),
+                     XkbAtomText(info->dpy, si->name, XkbMessage));
+                ACTION("Using last definition\n");
+            }
+            ClearOverlayInfo(old);
+            old->nKeys = new->nKeys;
+            old->keys = new->keys;
+            new->nKeys = 0;
+            new->keys = NULL;
+            return True;
+        }
+        if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0))
+            || (warningLevel > 9))
+        {
+            WARN2("Multiple doodads named \"%s\" in section \"%s\"\n",
+                  XkbAtomText(info->dpy, old->name, XkbMessage),
+                  XkbAtomText(info->dpy, si->name, XkbMessage));
+            ACTION("Using first definition\n");
+        }
+        return True;
+    }
+    old = new;
+    new = uTypedCalloc(1, OverlayInfo);
+    if (!new)
+    {
+        if (warningLevel > 0)
+        {
+            WSGO("Couldn't allocate a new OverlayInfo\n");
+            ACTION2
+                ("Overlay \"%s\" in section \"%s\" will be incomplete\n",
+                 XkbAtomText(info->dpy, old->name, XkbMessage),
+                 XkbAtomText(info->dpy, si->name, XkbMessage));
+        }
+        return False;
+    }
+    *new = *old;
+    old->nKeys = 0;
+    old->keys = NULL;
+    si->overlays = (OverlayInfo *) AddCommonInfo(&si->overlays->defs,
+                                                 (CommonInfo *) new);
+    si->nOverlays++;
+    return True;
+}
+
+/***====================================================================***/
+
+static SectionInfo *
+NextSection(GeometryInfo * info)
+{
+    SectionInfo *si;
+
+    si = uTypedAlloc(SectionInfo);
+    if (si)
+    {
+        *si = info->dfltSection;
+        si->defs.defined &= ~_GS_Default;
+        si->defs.next = NULL;
+        si->nRows = 0;
+        si->rows = NULL;
+        info->sections =
+            (SectionInfo *) AddCommonInfo(&info->sections->defs,
+                                          (CommonInfo *) si);
+        info->nSections++;
+    }
+    return si;
+}
+
+static SectionInfo *
+FindMatchingSection(GeometryInfo * info, SectionInfo * new)
+{
+    SectionInfo *old;
+
+    for (old = info->sections; old != NULL;
+         old = (SectionInfo *) old->defs.next)
+    {
+        if (new->name == old->name)
+            return old;
+    }
+    return NULL;
+}
+
+static Bool
+AddSection(GeometryInfo * info, SectionInfo * new)
+{
+    SectionInfo *old;
+
+    old = FindMatchingSection(info, new);
+    if (old != NULL)
+    {
+#ifdef NOTDEF
+        if ((new->defs.merge == MergeReplace)
+            || (new->defs.merge == MergeOverride))
+        {
+            SectionInfo *next = (SectionInfo *) old->defs.next;
+            if (((old->defs.fileID == new->defs.fileID)
+                 && (warningLevel > 0)) || (warningLevel > 9))
+            {
+                WARN1("Duplicate shape name \"%s\"\n",
+                      shText(info->dpy, old));
+                ACTION("Using last definition\n");
+            }
+            *old = *new;
+            old->defs.next = &next->defs;
+            return True;
+        }
+        if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0))
+            || (warningLevel > 9))
+        {
+            WARN1("Multiple shapes named \"%s\"\n", shText(info->dpy, old));
+            ACTION("Using first definition\n");
+        }
+        return True;
+#else
+        WARN("Don't know how to merge sections yet\n");
+#endif
+    }
+    old = new;
+    if ((new = NextSection(info)) == NULL)
+        return False;
+    *new = *old;
+    new->defs.next = NULL;
+    old->nRows = old->nDoodads = old->nOverlays = 0;
+    old->rows = NULL;
+    old->doodads = NULL;
+    old->overlays = NULL;
+    if (new->doodads)
+    {
+        DoodadInfo *di;
+        for (di = new->doodads; di; di = (DoodadInfo *) di->defs.next)
+        {
+            di->section = new;
+        }
+    }
+    return True;
+}
+
+/***====================================================================***/
+
+static RowInfo *
+NextRow(SectionInfo * si)
+{
+    RowInfo *row;
+
+    row = uTypedAlloc(RowInfo);
+    if (row)
+    {
+        *row = si->dfltRow;
+        row->defs.defined &= ~_GR_Default;
+        row->defs.next = NULL;
+        row->nKeys = 0;
+        row->keys = NULL;
+        si->rows =
+            (RowInfo *) AddCommonInfo(&si->rows->defs, (CommonInfo *) row);
+        row->index = si->nRows++;
+    }
+    return row;
+}
+
+static Bool
+AddRow(SectionInfo * si, RowInfo * new)
+{
+    RowInfo *old;
+
+    old = new;
+    if ((new = NextRow(si)) == NULL)
+        return False;
+    *new = *old;
+    new->defs.next = NULL;
+    old->nKeys = 0;
+    old->keys = NULL;
+    return True;
+}
+
+/***====================================================================***/
+
+static KeyInfo *
+NextKey(RowInfo * row)
+{
+    KeyInfo *key;
+
+    key = uTypedAlloc(KeyInfo);
+    if (key)
+    {
+        *key = row->dfltKey;
+        key->defs.defined &= ~_GK_Default;
+        key->defs.next = NULL;
+        key->index = row->nKeys++;
+    }
+    return key;
+}
+
+static Bool
+AddKey(RowInfo * row, KeyInfo * new)
+{
+    KeyInfo *old;
+
+    old = new;
+    if ((new = NextKey(row)) == NULL)
+        return False;
+    *new = *old;
+    new->defs.next = NULL;
+    row->keys =
+        (KeyInfo *) AddCommonInfo(&row->keys->defs, (CommonInfo *) new);
+    return True;
+}
+
+/***====================================================================***/
+
+static void
+MergeIncludedGeometry(GeometryInfo * into, GeometryInfo * from,
+                      unsigned merge)
+{
+    Bool clobber;
+
+    if (from->errorCount > 0)
+    {
+        into->errorCount += from->errorCount;
+        return;
+    }
+    clobber = (merge == MergeOverride) || (merge == MergeReplace);
+    if (into->name == NULL)
+    {
+        into->name = from->name;
+        from->name = NULL;
+    }
+    if ((into->widthMM == 0) || ((from->widthMM != 0) && clobber))
+        into->widthMM = from->widthMM;
+    if ((into->heightMM == 0) || ((from->heightMM != 0) && clobber))
+        into->heightMM = from->heightMM;
+    if ((into->font == None) || ((from->font != None) && clobber))
+        into->font = from->font;
+    if ((into->fontSlant == None) || ((from->fontSlant != None) && clobber))
+        into->fontSlant = from->fontSlant;
+    if ((into->fontWeight == None) || ((from->fontWeight != None) && clobber))
+        into->fontWeight = from->fontWeight;
+    if ((into->fontSetWidth == None)
+        || ((from->fontSetWidth != None) && clobber))
+        into->fontSetWidth = from->fontSetWidth;
+    if ((into->fontVariant == None)
+        || ((from->fontVariant != None) && clobber))
+        into->fontVariant = from->fontVariant;
+    if ((into->fontSize == 0) || ((from->fontSize != 0) && clobber))
+        into->fontSize = from->fontSize;
+    if ((into->fontEncoding == None)
+        || ((from->fontEncoding != None) && clobber))
+        into->fontEncoding = from->fontEncoding;
+    if ((into->fontSpec == None) || ((from->fontSpec != None) && clobber))
+        into->fontSpec = from->fontSpec;
+    if ((into->baseColor == None) || ((from->baseColor != None) && clobber))
+        into->baseColor = from->baseColor;
+    if ((into->labelColor == None) || ((from->labelColor != None) && clobber))
+        into->labelColor = from->labelColor;
+    into->nextPriority = from->nextPriority;
+    if (from->props != NULL)
+    {
+        PropertyInfo *pi;
+        for (pi = from->props; pi; pi = (PropertyInfo *) pi->defs.next)
+        {
+            if (!AddProperty(into, pi))
+                into->errorCount++;
+        }
+    }
+    if (from->shapes != NULL)
+    {
+        ShapeInfo *si;
+
+        for (si = from->shapes; si; si = (ShapeInfo *) si->defs.next)
+        {
+            if (!AddShape(into, si))
+                into->errorCount++;
+        }
+    }
+    if (from->sections != NULL)
+    {
+        SectionInfo *si;
+
+        for (si = from->sections; si; si = (SectionInfo *) si->defs.next)
+        {
+            if (!AddSection(into, si))
+                into->errorCount++;
+        }
+    }
+    if (from->doodads != NULL)
+    {
+        DoodadInfo *di;
+
+        for (di = from->doodads; di; di = (DoodadInfo *) di->defs.next)
+        {
+            if (!AddDoodad(NULL, into, di))
+                into->errorCount++;
+        }
+    }
+    if (!MergeAliases(&into->aliases, &from->aliases, merge))
+        into->errorCount++;
+    return;
+}
+
+typedef void (*FileHandler) (XkbFile * /* file */ ,
+                             XkbDescPtr /* xkb */ ,
+                             unsigned /* merge */ ,
+                             GeometryInfo *     /* info */
+    );
+
+static Bool
+HandleIncludeGeometry(IncludeStmt * stmt, XkbDescPtr xkb, GeometryInfo * info,
+                      FileHandler hndlr)
+{
+    unsigned newMerge;
+    XkbFile *rtrn;
+    GeometryInfo included;
+    Bool haveSelf;
+
+    haveSelf = False;
+    if ((stmt->file == NULL) && (stmt->map == NULL))
+    {
+        haveSelf = True;
+        included = *info;
+        bzero(info, sizeof(GeometryInfo));
+    }
+    else if (ProcessIncludeFile(stmt, XkmGeometryIndex, &rtrn, &newMerge))
+    {
+        InitGeometryInfo(&included, rtrn->id, newMerge);
+        included.nextPriority = info->nextPriority;
+        included.dfltCornerRadius = info->dfltCornerRadius;
+        DupSectionInfo(&included.dfltSection, &info->dfltSection, info);
+        (*hndlr) (rtrn, xkb, MergeOverride, &included);
+        if (stmt->stmt != NULL)
+        {
+            if (included.name != NULL)
+                uFree(included.name);
+            included.name = stmt->stmt;
+            stmt->stmt = NULL;
+        }
+    }
+    else
+    {
+        info->errorCount += 10;
+        return False;
+    }
+    if ((stmt->next != NULL) && (included.errorCount < 1))
+    {
+        IncludeStmt *next;
+        unsigned op;
+        GeometryInfo next_incl;
+
+        for (next = stmt->next; next != NULL; next = next->next)
+        {
+            if ((next->file == NULL) && (next->map == NULL))
+            {
+                haveSelf = True;
+                MergeIncludedGeometry(&included, info, next->merge);
+                ClearGeometryInfo(info);
+            }
+            else if (ProcessIncludeFile(next, XkmGeometryIndex, &rtrn, &op))
+            {
+                InitGeometryInfo(&next_incl, rtrn->id, op);
+                next_incl.nextPriority = included.nextPriority;
+                next_incl.dfltCornerRadius = included.dfltCornerRadius;
+                DupSectionInfo(&next_incl.dfltSection,
+                               &included.dfltSection, &included);
+                (*hndlr) (rtrn, xkb, MergeOverride, &next_incl);
+                MergeIncludedGeometry(&included, &next_incl, op);
+                ClearGeometryInfo(&next_incl);
+            }
+            else
+            {
+                info->errorCount += 10;
+                return False;
+            }
+        }
+    }
+    if (haveSelf)
+        *info = included;
+    else
+    {
+        MergeIncludedGeometry(info, &included, newMerge);
+        ClearGeometryInfo(&included);
+    }
+    return (info->errorCount == 0);
+}
+
+static int
+SetShapeField(ShapeInfo * si,
+              char *field,
+              ExprDef * arrayNdx, ExprDef * value, GeometryInfo * info)
+{
+    ExprResult tmp;
+
+    if ((uStrCaseCmp(field, "radius") == 0)
+        || (uStrCaseCmp(field, "corner") == 0)
+        || (uStrCaseCmp(field, "cornerradius") == 0))
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("key shape", field, shText(info->dpy, si));
+        }
+        if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("key shape", field,
+                                 shText(info->dpy, si), "number");
+        }
+        if (si)
+            si->dfltCornerRadius = tmp.ival;
+        else
+            info->dfltCornerRadius = tmp.ival;
+        return True;
+    }
+    info->errorCount++;
+    return ReportBadField("key shape", field, shText(info->dpy, si));
+}
+
+static int
+SetShapeDoodadField(DoodadInfo * di,
+                    char *field,
+                    ExprDef * arrayNdx,
+                    ExprDef * value, SectionInfo * si, GeometryInfo * info)
+{
+    ExprResult tmp;
+    const char *typeName;
+
+    typeName =
+        (di->type == XkbSolidDoodad ? "solid doodad" : "outline doodad");
+    if ((!uStrCaseCmp(field, "corner"))
+        || (!uStrCaseCmp(field, "cornerradius")))
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray(typeName, field, ddText(info->dpy, di));
+        }
+        if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType(typeName, field, ddText(info->dpy, di),
+                                 "number");
+        }
+        di->defs.defined |= _GD_Corner;
+        di->corner = tmp.ival;
+        return True;
+    }
+    else if (uStrCaseCmp(field, "angle") == 0)
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray(typeName, field, ddText(info->dpy, di));
+        }
+        if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType(typeName, field, ddText(info->dpy, di),
+                                 "number");
+        }
+        di->defs.defined |= _GD_Angle;
+        di->angle = tmp.ival;
+        return True;
+    }
+    else if (uStrCaseCmp(field, "shape") == 0)
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray(typeName, field, ddText(info->dpy, di));
+        }
+        if (!ExprResolveString(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType(typeName, field, ddText(info->dpy, di),
+                                 "string");
+        }
+        di->shape = XkbInternAtom(info->dpy, tmp.str, False);
+        di->defs.defined |= _GD_Shape;
+        return True;
+    }
+    return ReportBadField(typeName, field, ddText(info->dpy, di));
+}
+
+#define        FIELD_STRING    0
+#define        FIELD_SHORT     1
+#define        FIELD_USHORT    2
+
+static int
+SetTextDoodadField(DoodadInfo * di,
+                   char *field,
+                   ExprDef * arrayNdx,
+                   ExprDef * value, SectionInfo * si, GeometryInfo * info)
+{
+    ExprResult tmp;
+    unsigned def;
+    unsigned type;
+    char *typeName = "text doodad";
+    union
+    {
+        Atom *str;
+        short *ival;
+        unsigned short *uval;
+    } pField;
+
+    if (uStrCaseCmp(field, "angle") == 0)
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray(typeName, field, ddText(info->dpy, di));
+        }
+        if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType(typeName, field, ddText(info->dpy, di),
+                                 "number");
+        }
+        di->defs.defined |= _GD_Angle;
+        di->angle = tmp.ival;
+        return True;
+    }
+    if (uStrCaseCmp(field, "width") == 0)
+    {
+        type = FIELD_USHORT;
+        pField.uval = &di->width;
+        def = _GD_Width;
+    }
+    else if (uStrCaseCmp(field, "height") == 0)
+    {
+        type = FIELD_USHORT;
+        pField.uval = &di->height;
+        def = _GD_Height;
+    }
+    else if (uStrCaseCmp(field, "text") == 0)
+    {
+        type = FIELD_STRING;
+        pField.str = &di->text;
+        def = _GD_Text;
+    }
+    else if (uStrCaseCmp(field, "font") == 0)
+    {
+        type = FIELD_STRING;
+        pField.str = &di->font;
+        def = _GD_Font;
+    }
+    else if ((uStrCaseCmp(field, "fontslant") == 0) ||
+             (uStrCaseCmp(field, "slant") == 0))
+    {
+        type = FIELD_STRING;
+        pField.str = &di->fontSlant;
+        def = _GD_FontSlant;
+    }
+    else if ((uStrCaseCmp(field, "fontweight") == 0) ||
+             (uStrCaseCmp(field, "weight") == 0))
+    {
+        type = FIELD_STRING;
+        pField.str = &di->fontWeight;
+        def = _GD_FontWeight;
+    }
+    else if ((uStrCaseCmp(field, "fontwidth") == 0) ||
+             (uStrCaseCmp(field, "setwidth") == 0))
+    {
+        type = FIELD_STRING;
+        pField.str = &di->fontSetWidth;
+        def = _GD_FontSetWidth;
+    }
+    else if ((uStrCaseCmp(field, "fontvariant") == 0) ||
+             (uStrCaseCmp(field, "variant") == 0))
+    {
+        type = FIELD_STRING;
+        pField.str = &di->fontVariant;
+        def = _GD_FontVariant;
+    }
+    else if ((uStrCaseCmp(field, "fontencoding") == 0) ||
+             (uStrCaseCmp(field, "encoding") == 0))
+    {
+        type = FIELD_STRING;
+        pField.str = &di->fontEncoding;
+        def = _GD_FontEncoding;
+    }
+    else if ((uStrCaseCmp(field, "xfont") == 0) ||
+             (uStrCaseCmp(field, "xfontname") == 0))
+    {
+        type = FIELD_STRING;
+        pField.str = &di->fontSpec;
+        def = _GD_FontSpec;
+    }
+    else if (uStrCaseCmp(field, "fontsize") == 0)
+    {
+        type = FIELD_USHORT;
+        pField.uval = &di->fontSize;
+        def = _GD_FontSize;
+    }
+    else
+    {
+        return ReportBadField(typeName, field, ddText(info->dpy, di));
+    }
+    if (arrayNdx != NULL)
+    {
+        info->errorCount++;
+        return ReportNotArray(typeName, field, ddText(info->dpy, di));
+    }
+    if (type == FIELD_STRING)
+    {
+        if (!ExprResolveString(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType(typeName, field, ddText(info->dpy, di),
+                                 "string");
+        }
+        di->defs.defined |= def;
+        *pField.str = XkbInternAtom(NULL, tmp.str, False);
+    }
+    else
+    {
+        if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType(typeName, field, ddText(info->dpy, di),
+                                 "number");
+        }
+        if ((type == FIELD_USHORT) && (tmp.ival < 0))
+        {
+            info->errorCount++;
+            return
+                ReportBadType(typeName, field, ddText(info->dpy, di),
+                              "unsigned");
+        }
+        di->defs.defined |= def;
+        if (type == FIELD_USHORT)
+            *pField.uval = tmp.uval;
+        else
+            *pField.ival = tmp.ival;
+    }
+    return True;
+}
+
+static int
+SetIndicatorDoodadField(DoodadInfo * di,
+                        char *field,
+                        ExprDef * arrayNdx,
+                        ExprDef * value,
+                        SectionInfo * si, GeometryInfo * info)
+{
+    ExprResult tmp;
+
+    if ((uStrCaseCmp(field, "oncolor") == 0)
+        || (uStrCaseCmp(field, "offcolor") == 0)
+        || (uStrCaseCmp(field, "shape") == 0))
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("indicator doodad", field,
+                                  ddText(info->dpy, di));
+        }
+        if (!ExprResolveString(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("indicator doodad", field,
+                                 ddText(info->dpy, di), "string");
+        }
+        if (uStrCaseCmp(field, "oncolor") == 0)
+        {
+            di->defs.defined |= _GD_Color;
+            di->color = XkbInternAtom(NULL, tmp.str, False);
+        }
+        else if (uStrCaseCmp(field, "offcolor") == 0)
+        {
+            di->defs.defined |= _GD_OffColor;
+            di->offColor = XkbInternAtom(NULL, tmp.str, False);
+        }
+        else if (uStrCaseCmp(field, "shape") == 0)
+        {
+            di->defs.defined |= _GD_Shape;
+            di->shape = XkbInternAtom(info->dpy, tmp.str, False);
+        }
+        return True;
+    }
+    return ReportBadField("indicator doodad", field, ddText(info->dpy, di));
+}
+
+static int
+SetLogoDoodadField(DoodadInfo * di,
+                   char *field,
+                   ExprDef * arrayNdx,
+                   ExprDef * value, SectionInfo * si, GeometryInfo * info)
+{
+    ExprResult tmp;
+    char *typeName = "logo doodad";
+
+    if ((!uStrCaseCmp(field, "corner"))
+        || (!uStrCaseCmp(field, "cornerradius")))
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray(typeName, field, ddText(info->dpy, di));
+        }
+        if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType(typeName, field, ddText(info->dpy, di),
+                                 "number");
+        }
+        di->defs.defined |= _GD_Corner;
+        di->corner = tmp.ival;
+        return True;
+    }
+    else if (uStrCaseCmp(field, "angle") == 0)
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray(typeName, field, ddText(info->dpy, di));
+        }
+        if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType(typeName, field, ddText(info->dpy, di),
+                                 "number");
+        }
+        di->defs.defined |= _GD_Angle;
+        di->angle = tmp.ival;
+        return True;
+    }
+    else if (uStrCaseCmp(field, "shape") == 0)
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray(typeName, field, ddText(info->dpy, di));
+        }
+        if (!ExprResolveString(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType(typeName, field, ddText(info->dpy, di),
+                                 "string");
+        }
+        di->shape = XkbInternAtom(info->dpy, tmp.str, False);
+        di->defs.defined |= _GD_Shape;
+        return True;
+    }
+    else if ((!uStrCaseCmp(field, "logoname"))
+             || (!uStrCaseCmp(field, "name")))
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray(typeName, field, ddText(info->dpy, di));
+        }
+        if (!ExprResolveString(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType(typeName, field, ddText(info->dpy, di),
+                                 "string");
+        }
+        di->logoName = uStringDup(tmp.str);
+        return True;
+    }
+    return ReportBadField(typeName, field, ddText(info->dpy, di));
+}
+
+static int
+SetDoodadField(DoodadInfo * di,
+               char *field,
+               ExprDef * arrayNdx,
+               ExprDef * value, SectionInfo * si, GeometryInfo * info)
+{
+    ExprResult tmp;
+
+    if (uStrCaseCmp(field, "priority") == 0)
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("doodad", field, ddText(info->dpy, di));
+        }
+        if (!ExprResolveInteger(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("doodad", field, ddText(info->dpy, di),
+                                 "integer");
+        }
+        if ((tmp.ival < 0) || (tmp.ival > XkbGeomMaxPriority))
+        {
+            info->errorCount++;
+            ERROR2("Doodad priority %d out of range (must be 0..%d)\n",
+                   tmp.ival, XkbGeomMaxPriority);
+            ACTION1("Priority for doodad %s not changed",
+                    ddText(info->dpy, di));
+            return False;
+        }
+        di->defs.defined |= _GD_Priority;
+        di->priority = tmp.ival;
+        return True;
+    }
+    else if (uStrCaseCmp(field, "left") == 0)
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("doodad", field, ddText(info->dpy, di));
+        }
+        if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("doodad", field, ddText(info->dpy, di),
+                                 "number");
+        }
+        di->defs.defined |= _GD_Left;
+        di->left = tmp.ival;
+        return True;
+    }
+    else if (uStrCaseCmp(field, "top") == 0)
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("doodad", field, ddText(info->dpy, di));
+        }
+        if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("doodad", field, ddText(info->dpy, di),
+                                 "number");
+        }
+        di->defs.defined |= _GD_Top;
+        di->top = tmp.ival;
+        return True;
+    }
+    else if (uStrCaseCmp(field, "color") == 0)
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("doodad", field, ddText(info->dpy, di));
+        }
+        if (!ExprResolveString(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("doodad", field, ddText(info->dpy, di),
+                                 "string");
+        }
+        di->defs.defined |= _GD_Color;
+        di->color = XkbInternAtom(NULL, tmp.str, False);
+        return True;
+    }
+    switch (di->type)
+    {
+    case XkbOutlineDoodad:
+    case XkbSolidDoodad:
+        return SetShapeDoodadField(di, field, arrayNdx, value, si, info);
+    case XkbTextDoodad:
+        return SetTextDoodadField(di, field, arrayNdx, value, si, info);
+    case XkbIndicatorDoodad:
+        return SetIndicatorDoodadField(di, field, arrayNdx, value, si, info);
+    case XkbLogoDoodad:
+        return SetLogoDoodadField(di, field, arrayNdx, value, si, info);
+    }
+    WSGO1("Unknown doodad type %d in SetDoodadField\n",
+          (unsigned int) di->type);
+    ACTION2("Definition of %s in %s ignored\n", field, ddText(info->dpy, di));
+    return False;
+}
+
+static int
+SetSectionField(SectionInfo * si,
+                char *field,
+                ExprDef * arrayNdx, ExprDef * value, GeometryInfo * info)
+{
+    unsigned short *pField;
+    unsigned def;
+    ExprResult tmp;
+
+    pField = NULL;
+    def = 0;
+    if (uStrCaseCmp(field, "priority") == 0)
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("keyboard section", field,
+                                  scText(info->dpy, si));
+        }
+        if (!ExprResolveInteger(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            ReportBadType("keyboard section", field,
+                          scText(info->dpy, si), "integer");
+            return False;
+        }
+        if ((tmp.ival < 0) || (tmp.ival > XkbGeomMaxPriority))
+        {
+            info->errorCount++;
+            ERROR2("Section priority %d out of range (must be 0..%d)\n",
+                   tmp.ival, XkbGeomMaxPriority);
+            ACTION1("Priority for section %s not changed",
+                    scText(info->dpy, si));
+            return False;
+        }
+        si->priority = tmp.ival;
+        si->defs.defined |= _GS_Priority;
+        return True;
+    }
+    else if (uStrCaseCmp(field, "top") == 0)
+    {
+        pField = &si->top;
+        def = _GS_Top;
+    }
+    else if (uStrCaseCmp(field, "left") == 0)
+    {
+        pField = &si->left;
+        def = _GS_Left;
+    }
+    else if (uStrCaseCmp(field, "width") == 0)
+    {
+        pField = &si->width;
+        def = _GS_Width;
+    }
+    else if (uStrCaseCmp(field, "height") == 0)
+    {
+        pField = &si->height;
+        def = _GS_Height;
+    }
+    else if (uStrCaseCmp(field, "angle") == 0)
+    {
+        pField = &si->angle;
+        def = _GS_Angle;
+    }
+    else
+    {
+        info->errorCount++;
+        return ReportBadField("keyboard section", field,
+                              scText(info->dpy, si));
+    }
+    if (arrayNdx != NULL)
+    {
+        info->errorCount++;
+        return ReportNotArray("keyboard section", field,
+                              scText(info->dpy, si));
+    }
+    if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+    {
+        info->errorCount++;
+        ReportBadType("keyboard section", field, scText(info->dpy, si),
+                      "number");
+        return False;
+    }
+    si->defs.defined |= def;
+    *pField = tmp.uval;
+    return True;
+}
+
+static int
+SetRowField(RowInfo * row,
+            char *field,
+            ExprDef * arrayNdx, ExprDef * value, GeometryInfo * info)
+{
+    ExprResult tmp;
+
+    if (uStrCaseCmp(field, "top") == 0)
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("keyboard row", field,
+                                  rowText(info->dpy, row));
+        }
+        if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("keyboard row", field,
+                                 rowText(info->dpy, row), "number");
+        }
+        row->defs.defined |= _GR_Top;
+        row->top = tmp.uval;
+    }
+    else if (uStrCaseCmp(field, "left") == 0)
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("keyboard row", field,
+                                  rowText(info->dpy, row));
+        }
+        if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("keyboard row", field,
+                                 rowText(info->dpy, row), "number");
+        }
+        row->defs.defined |= _GR_Left;
+        row->left = tmp.uval;
+    }
+    else if (uStrCaseCmp(field, "vertical") == 0)
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("keyboard row", field,
+                                  rowText(info->dpy, row));
+        }
+        if (!ExprResolveBoolean(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("keyboard row", field,
+                                 rowText(info->dpy, row), "boolean");
+        }
+        row->defs.defined |= _GR_Vertical;
+        row->vertical = tmp.uval;
+    }
+    else
+    {
+        info->errorCount++;
+        return ReportBadField("keyboard row", field, rowText(info->dpy, row));
+    }
+    return True;
+}
+
+static int
+SetKeyField(KeyInfo * key,
+            const char *field,
+            ExprDef * arrayNdx, ExprDef * value, GeometryInfo * info)
+{
+    ExprResult tmp;
+
+    if (uStrCaseCmp(field, "gap") == 0)
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("key", field, keyText(key));
+        }
+        if (!ExprResolveFloat(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("key", field, keyText(key), "number");
+        }
+        key->defs.defined |= _GK_Gap;
+        key->gap = tmp.ival;
+    }
+    else if (uStrCaseCmp(field, "shape") == 0)
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("key", field, keyText(key));
+        }
+        if (!ExprResolveString(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("key", field, keyText(key), "string");
+        }
+        key->defs.defined |= _GK_Shape;
+        key->shape = XkbInternAtom(info->dpy, tmp.str, False);
+    }
+    else if ((uStrCaseCmp(field, "color") == 0) ||
+             (uStrCaseCmp(field, "keycolor") == 0))
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("key", field, keyText(key));
+        }
+        if (!ExprResolveString(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("key", field, keyText(key), "string");
+        }
+        key->defs.defined |= _GK_Color;
+        key->color = XkbInternAtom(NULL, tmp.str, False);
+    }
+    else if ((uStrCaseCmp(field, "name") == 0)
+             || (uStrCaseCmp(field, "keyname") == 0))
+    {
+        if (arrayNdx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("key", field, keyText(key));
+        }
+        if (!ExprResolveKeyName(value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("key", field, keyText(key), "key name");
+        }
+        key->defs.defined |= _GK_Name;
+        bzero(key->name, XkbKeyNameLength + 1);
+        strncpy(key->name, tmp.keyName.name, XkbKeyNameLength);
+    }
+    else
+    {
+        info->errorCount++;
+        return ReportBadField("key", field, keyText(key));
+    }
+    return True;
+}
+
+static int
+SetGeometryProperty(GeometryInfo * info, char *property, ExprDef * value)
+{
+    PropertyInfo pi;
+    ExprResult result;
+
+    InitPropertyInfo(&pi, info);
+    pi.name = property;
+    if (!ExprResolveString(value, &result, NULL, NULL))
+    {
+        info->errorCount++;
+        ERROR("Property values must be type string\n");
+        ACTION1("Ignoring illegal definition of \"%s\" property\n", property);
+        return False;
+    }
+    pi.value = result.str;
+    return AddProperty(info, &pi);
+}
+
+static int
+HandleGeometryVar(VarDef * stmt, XkbDescPtr xkb, GeometryInfo * info)
+{
+    ExprResult elem, field, tmp;
+    ExprDef *ndx;
+    DoodadInfo *di;
+    Atom *pField;
+
+    if (ExprResolveLhs(stmt->name, &elem, &field, &ndx) == 0)
+        return 0;               /* internal error, already reported */
+    if (elem.str && (uStrCaseCmp(elem.str, "shape") == 0))
+        return SetShapeField(NULL, field.str, ndx, stmt->value, info);
+    if (elem.str && (uStrCaseCmp(elem.str, "key") == 0))
+        return SetKeyField(&info->dfltSection.dfltRow.dfltKey,
+                           field.str, ndx, stmt->value, info);
+    if (elem.str && (uStrCaseCmp(elem.str, "row") == 0))
+        return SetRowField(&info->dfltSection.dfltRow, field.str, ndx,
+                           stmt->value, info);
+    if (elem.str && (uStrCaseCmp(elem.str, "section") == 0))
+    {
+        return SetSectionField(&info->dfltSection, field.str, ndx,
+                               stmt->value, info);
+    }
+    if (elem.str && (uStrCaseCmp(elem.str, "property") == 0))
+    {
+        if (ndx != NULL)
+        {
+            info->errorCount++;
+            ERROR1("The %s geometry property is not an array\n", field.str);
+            ACTION("Ignoring illegal property definition\n");
+            return False;
+        }
+        return SetGeometryProperty(info, field.str, stmt->value);
+    }
+    if (elem.str
+        && ((di = FindDfltDoodadByTypeName(elem.str, NULL, info)) != NULL))
+    {
+        return SetDoodadField(di, field.str, ndx, stmt->value, NULL, info);
+    }
+    if (elem.str && (uStrCaseCmp(elem.str, "solid") == 0))
+    {
+        DoodadInfo *dflt;
+        dflt = FindDoodadByType(info->dfltDoodads, XkbSolidDoodad);
+        if (dflt == NULL)
+            dflt = NextDfltDoodad(NULL, info);
+        return SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info);
+    }
+    if (elem.str && (uStrCaseCmp(elem.str, "outline") == 0))
+    {
+        DoodadInfo *dflt;
+        dflt = FindDoodadByType(info->dfltDoodads, XkbOutlineDoodad);
+        if (dflt == NULL)
+            dflt = NextDfltDoodad(NULL, info);
+        return SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info);
+    }
+    if (elem.str && (uStrCaseCmp(elem.str, "text") == 0))
+    {
+        DoodadInfo *dflt;
+        dflt = FindDoodadByType(info->dfltDoodads, XkbTextDoodad);
+        if (dflt == NULL)
+            dflt = NextDfltDoodad(NULL, info);
+        return SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info);
+    }
+    if (elem.str && (uStrCaseCmp(elem.str, "indicator") == 0))
+    {
+        DoodadInfo *dflt;
+        dflt = FindDoodadByType(info->dfltDoodads, XkbIndicatorDoodad);
+        if (dflt == NULL)
+            dflt = NextDfltDoodad(NULL, info);
+        return SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info);
+    }
+    if (elem.str && (uStrCaseCmp(elem.str, "logo") == 0))
+    {
+        DoodadInfo *dflt;
+        dflt = FindDoodadByType(info->dfltDoodads, XkbLogoDoodad);
+        if (dflt == NULL)
+            dflt = NextDfltDoodad(NULL, info);
+        return SetDoodadField(dflt, field.str, ndx, stmt->value, NULL, info);
+    }
+    if (elem.str)
+    {
+        WARN("Assignment to field of unknown element\n");
+        ACTION2("No value assigned to %s.%s\n", elem.str, field.str);
+        return False;
+    }
+
+    if ((uStrCaseCmp(field.str, "width") == 0) ||
+        (uStrCaseCmp(field.str, "widthmm") == 0))
+    {
+        if (ndx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("keyboard", field.str, "geometry");
+        }
+        if (!ExprResolveFloat(stmt->value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("keyboard", field.str, "geometry", "number");
+        }
+        if (tmp.ival < 1)
+        {
+            WARN("Keyboard width must be positive\n");
+            ACTION1("Ignoring illegal keyboard width %s\n",
+                    XkbGeomFPText(tmp.ival, XkbMessage));
+            return True;
+        }
+        if (info->widthMM != 0)
+        {
+            WARN("Keyboard width multiply defined\n");
+            ACTION1("Using last definition (%s),",
+                    XkbGeomFPText(tmp.ival, XkbMessage));
+            INFO1(" ignoring first (%s)\n",
+                  XkbGeomFPText(info->widthMM, XkbMessage));
+        }
+        info->widthMM = tmp.ival;
+        return True;
+    }
+    else if ((uStrCaseCmp(field.str, "height") == 0) ||
+             (uStrCaseCmp(field.str, "heightmm") == 0))
+    {
+        if (ndx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("keyboard", field.str, "geometry");
+        }
+        if (!ExprResolveFloat(stmt->value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("keyboard", field.str, "geometry", "number");
+        }
+        if (tmp.ival < 1)
+        {
+            WARN("Keyboard height must be positive\n");
+            ACTION1("Ignoring illegal keyboard height %s\n",
+                    XkbGeomFPText(tmp.ival, XkbMessage));
+            return True;
+        }
+        if (info->heightMM != 0)
+        {
+            WARN("Keyboard height multiply defined\n");
+            ACTION1("Using last definition (%s),",
+                    XkbGeomFPText(tmp.ival, XkbMessage));
+            INFO1(" ignoring first (%s)\n",
+                  XkbGeomFPText(info->heightMM, XkbMessage));
+        }
+        info->heightMM = tmp.ival;
+        return True;
+    }
+    else if (uStrCaseCmp(field.str, "font") == 0)
+    {
+        pField = &info->font;
+    }
+    else if ((uStrCaseCmp(field.str, "fontslant") == 0) ||
+             (uStrCaseCmp(field.str, "slant") == 0))
+    {
+        pField = &info->fontSlant;
+    }
+    else if ((uStrCaseCmp(field.str, "fontweight") == 0) ||
+             (uStrCaseCmp(field.str, "weight") == 0))
+    {
+        pField = &info->fontWeight;
+    }
+    else if ((uStrCaseCmp(field.str, "fontwidth") == 0) ||
+             (uStrCaseCmp(field.str, "setwidth") == 0))
+    {
+        pField = &info->fontWeight;
+    }
+    else if ((uStrCaseCmp(field.str, "fontencoding") == 0) ||
+             (uStrCaseCmp(field.str, "encoding") == 0))
+    {
+        pField = &info->fontEncoding;
+    }
+    else if ((uStrCaseCmp(field.str, "xfont") == 0) ||
+             (uStrCaseCmp(field.str, "xfontname") == 0))
+    {
+        pField = &info->fontSpec;
+    }
+    else if (uStrCaseCmp(field.str, "fontsize") == 0)
+    {
+        if (ndx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("keyboard", field.str, "geometry");
+        }
+        if (!ExprResolveFloat(stmt->value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("keyboard", field.str, "geometry", "number");
+        }
+        if ((tmp.ival < 40) || (tmp.ival > 2550))
+        {
+            info->errorCount++;
+            ERROR1("Illegal font size %d (must be 4..255)\n", tmp.ival);
+            ACTION("Ignoring font size in keyboard geometry\n");
+            return False;
+        }
+        info->fontSize = tmp.ival;
+        return True;
+    }
+    else if ((uStrCaseCmp(field.str, "color") == 0) ||
+             (uStrCaseCmp(field.str, "basecolor") == 0))
+    {
+        if (ndx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("keyboard", field.str, "geometry");
+        }
+        if (!ExprResolveString(stmt->value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("keyboard", field.str, "geometry", "string");
+        }
+        info->baseColor = XkbInternAtom(NULL, tmp.str, False);
+        return True;
+    }
+    else if (uStrCaseCmp(field.str, "labelcolor") == 0)
+    {
+        if (ndx != NULL)
+        {
+            info->errorCount++;
+            return ReportNotArray("keyboard", field.str, "geometry");
+        }
+        if (!ExprResolveString(stmt->value, &tmp, NULL, NULL))
+        {
+            info->errorCount++;
+            return ReportBadType("keyboard", field.str, "geometry", "string");
+        }
+        info->labelColor = XkbInternAtom(NULL, tmp.str, False);
+        return True;
+    }
+    else
+    {
+        return SetGeometryProperty(info, field.str, stmt->value);
+    }
+
+    if (ndx != NULL)
+    {
+        info->errorCount++;
+        return ReportNotArray("keyboard", field.str, "geometry");
+    }
+    if (!ExprResolveString(stmt->value, &tmp, NULL, NULL))
+    {
+        info->errorCount++;
+        return ReportBadType("keyboard", field.str, "geometry", "string");
+    }
+    *pField = XkbInternAtom(NULL, tmp.str, False);
+    return True;
+}
+
+/***====================================================================***/
+
+static Bool
+HandleShapeBody(ShapeDef * def, ShapeInfo * si, unsigned merge,
+                GeometryInfo * info)
+{
+    OutlineDef *ol;
+    int nOut, nPt;
+    XkbOutlinePtr outline;
+    ExprDef *pt;
+
+    if (def->nOutlines < 1)
+    {
+        WARN1("Shape \"%s\" has no outlines\n", shText(info->dpy, si));
+        ACTION("Definition ignored\n");
+        return True;
+    }
+    si->nOutlines = def->nOutlines;
+    si->outlines = uTypedCalloc(def->nOutlines, XkbOutlineRec);
+    if (!si->outlines)
+    {
+        ERROR1("Couldn't allocate outlines for \"%s\"\n",
+               shText(info->dpy, si));
+        ACTION("Definition ignored\n");
+        info->errorCount++;
+        return False;
+    }
+    for (nOut = 0, ol = def->outlines; ol != NULL;
+         ol = (OutlineDef *) ol->common.next)
+    {
+        if (ol->nPoints < 1)
+        {
+            SetShapeField(si, XkbAtomGetString(NULL, ol->field), NULL,
+                          ol->points, info);
+            continue;
+        }
+        outline = NULL;
+        outline = &si->outlines[nOut++];
+        outline->num_points = ol->nPoints;
+        outline->corner_radius = si->dfltCornerRadius;
+        outline->points = uTypedCalloc(ol->nPoints, XkbPointRec);
+        if (!outline->points)
+        {
+            ERROR1("Can't allocate points for \"%s\"\n",
+                   shText(info->dpy, si));
+            ACTION("Definition ignored\n");
+            info->errorCount++;
+            return False;
+        }
+        for (nPt = 0, pt = ol->points; pt != NULL;
+             pt = (ExprDef *) pt->common.next)
+        {
+            outline->points[nPt].x = pt->value.coord.x;
+            outline->points[nPt].y = pt->value.coord.y;
+            nPt++;
+        }
+        if (ol->field != None)
+        {
+            char *str = XkbAtomText(NULL, ol->field, XkbMessage);
+            if ((uStrCaseCmp(str, "approximation") == 0) ||
+                (uStrCaseCmp(str, "approx") == 0))
+            {
+                if (si->approx == NULL)
+                    si->approx = outline;
+                else
+                {
+                    WARN1("Multiple approximations for \"%s\"\n",
+                          shText(info->dpy, si));
+                    ACTION("Treating all but the first as normal outlines\n");
+                }
+            }
+            else if (uStrCaseCmp(str, "primary") == 0)
+            {
+                if (si->primary == NULL)
+                    si->primary = outline;
+                else
+                {
+                    WARN1("Multiple primary outlines for \"%s\"\n",
+                          shText(info->dpy, si));
+                    ACTION("Treating all but the first as normal outlines\n");
+                }
+            }
+            else
+            {
+                WARN2("Unknown outline type %s for \"%s\"\n", str,
+                      shText(info->dpy, si));
+                ACTION("Treated as a normal outline\n");
+            }
+        }
+    }
+    if (nOut != si->nOutlines)
+    {
+        WSGO2("Expected %d outlines, got %d\n",
+              (unsigned int) si->nOutlines, nOut);
+        si->nOutlines = nOut;
+    }
+    return True;
+}
+
+static int
+HandleShapeDef(ShapeDef * def, XkbDescPtr xkb, unsigned merge,
+               GeometryInfo * info)
+{
+    ShapeInfo si;
+
+    if (def->merge != MergeDefault)
+        merge = def->merge;
+
+    bzero(&si, sizeof(ShapeInfo));
+    si.defs.merge = merge;
+    si.name =
+        XkbInternAtom(info->dpy, XkbAtomGetString(NULL, def->name), False);
+    si.dfltCornerRadius = info->dfltCornerRadius;
+    if (!HandleShapeBody(def, &si, merge, info))
+        return False;
+    if (!AddShape(info, &si))
+        return False;
+    return True;
+}
+
+/***====================================================================***/
+
+static int
+HandleDoodadDef(DoodadDef * def,
+                unsigned merge, SectionInfo * si, GeometryInfo * info)
+{
+    ExprResult elem, field;
+    ExprDef *ndx;
+    DoodadInfo new;
+    VarDef *var;
+
+    if (def->common.stmtType == StmtIndicatorMapDef)
+    {
+        def->common.stmtType = StmtDoodadDef;
+        def->type = XkbIndicatorDoodad;
+    }
+    InitDoodadInfo(&new, def->type, si, info);
+    new.name =
+        XkbInternAtom(info->dpy, XkbAtomGetString(NULL, def->name), False);
+    for (var = def->body; var != NULL; var = (VarDef *) var->common.next)
+    {
+        if (ExprResolveLhs(var->name, &elem, &field, &ndx) == 0)
+            return 0;           /* internal error, already reported */
+        if (elem.str != NULL)
+        {
+            WARN1("Assignment to field of unknown element in doodad %s\n",
+                  ddText(info->dpy, &new));
+            ACTION2("No value assigned to %s.%s\n", elem.str, field.str);
+        }
+        else if (!SetDoodadField(&new, field.str, ndx, var->value, si, info))
+            return False;
+    }
+    if (!AddDoodad(si, info, &new))
+        return False;
+    ClearDoodadInfo(&new);
+    return True;
+}
+
+/***====================================================================***/
+
+static int
+HandleOverlayDef(OverlayDef * def,
+                 unsigned merge, SectionInfo * si, GeometryInfo * info)
+{
+    OverlayKeyDef *keyDef;
+    OverlayKeyInfo *key;
+    OverlayInfo ol;
+
+    if ((def->nKeys < 1) && (warningLevel > 3))
+    {
+        WARN2("Overlay \"%s\" in section \"%s\" has no keys\n",
+              XkbAtomText(NULL, def->name, XkbMessage), scText(info->dpy,
+                                                               si));
+        ACTION("Overlay ignored\n");
+        return True;
+    }
+    bzero(&ol, sizeof(OverlayInfo));
+    ol.name =
+        XkbInternAtom(info->dpy, XkbAtomGetString(NULL, def->name), False);
+    for (keyDef = def->keys; keyDef;
+         keyDef = (OverlayKeyDef *) keyDef->common.next)
+    {
+        key = uTypedCalloc(1, OverlayKeyInfo);
+        if ((!key) && warningLevel > 0)
+        {
+            WSGO("Couldn't allocate OverlayKeyInfo\n");
+            ACTION2("Overlay %s for section %s will be incomplete\n",
+                    XkbAtomText(info->dpy, ol.name, XkbMessage),
+                    scText(info->dpy, si));
+            return False;
+        }
+        strncpy(key->over, keyDef->over, XkbKeyNameLength);
+        strncpy(key->under, keyDef->under, XkbKeyNameLength);
+        key->sectionRow = _GOK_UnknownRow;
+        key->overlayRow = _GOK_UnknownRow;
+        ol.keys = (OverlayKeyInfo *) AddCommonInfo(&ol.keys->defs,
+                                                   (CommonInfo *) key);
+        ol.nKeys++;
+    }
+    if (!AddOverlay(si, info, &ol))
+        return False;
+    ClearOverlayInfo(&ol);
+    return True;
+}
+
+/***====================================================================***/
+
+static Bool
+HandleComplexKey(KeyDef * def, KeyInfo * key, GeometryInfo * info)
+{
+    RowInfo *row;
+    ExprDef *expr;
+
+    row = key->row;
+    for (expr = def->expr; expr != NULL; expr = (ExprDef *) expr->common.next)
+    {
+        if (expr->op == OpAssign)
+        {
+            ExprResult elem, f;
+            ExprDef *ndx;
+            if (ExprResolveLhs(expr->value.binary.left, &elem, &f, &ndx) == 0)
+                return False;   /* internal error, already reported */
+            if ((elem.str == NULL) || (uStrCaseCmp(elem.str, "key") == 0))
+            {
+                if (!SetKeyField
+                    (key, f.str, ndx, expr->value.binary.right, info))
+                    return False;
+            }
+            else
+            {
+                ERROR("Illegal element used in a key definition\n");
+                ACTION2("Assignment to %s.%s ignored\n", elem.str, f.str);
+                return False;
+            }
+        }
+        else
+        {
+            switch (expr->type)
+            {
+            case TypeInt:
+            case TypeFloat:
+                if (!SetKeyField(key, "gap", NULL, expr, info))
+                    return False;
+                break;
+            case TypeString:
+                if (!SetKeyField(key, "shape", NULL, expr, info))
+                    return False;
+                break;
+            case TypeKeyName:
+                if (!SetKeyField(key, "name", NULL, expr, info))
+                    return False;
+                break;
+            default:
+                ERROR("Cannot determine field for unnamed expression\n");
+                ACTION3("Ignoring key %d in row %d of section %s\n",
+                        row->nKeys + 1, row->section->nRows + 1,
+                        rowText(info->dpy, row));
+                return False;
+            }
+        }
+    }
+    return True;
+}
+
+static Bool
+HandleRowBody(RowDef * def, RowInfo * row, unsigned merge,
+              GeometryInfo * info)
+{
+    KeyDef *keyDef;
+
+    if ((def->nKeys < 1) && (warningLevel > 3))
+    {
+        ERROR1("Row in section %s has no keys\n", rowText(info->dpy, row));
+        ACTION("Section ignored\n");
+        return True;
+    }
+    for (keyDef = def->keys; keyDef != NULL;
+         keyDef = (KeyDef *) keyDef->common.next)
+    {
+        if (keyDef->common.stmtType == StmtVarDef)
+        {
+            VarDef *var = (VarDef *) keyDef;
+            ExprResult elem, field;
+            ExprDef *ndx;
+            if (ExprResolveLhs(var->name, &elem, &field, &ndx) == 0)
+                return 0;       /* internal error, already reported */
+            if ((elem.str == NULL) || (uStrCaseCmp(elem.str, "row") == 0))
+            {
+                if (!SetRowField(row, field.str, ndx, var->value, info))
+                    return False;
+            }
+            else if (uStrCaseCmp(elem.str, "key") == 0)
+            {
+                if (!SetKeyField
+                    (&row->dfltKey, field.str, ndx, var->value, info))
+                    return False;
+            }
+            else
+            {
+                WARN("Assignment to field of unknown element in row\n");
+                ACTION2("No value assigned to %s.%s\n", elem.str, field.str);
+            }
+        }
+        else if (keyDef->common.stmtType == StmtKeyDef)
+        {
+            KeyInfo key;
+            InitKeyInfo(&key, row, info);
+            if (keyDef->name != NULL)
+            {
+                int len = strlen(keyDef->name);
+                if ((len < 1) || (len > XkbKeyNameLength))
+                {
+                    ERROR2("Illegal name %s for key in section %s\n",
+                           keyDef->name, rowText(info->dpy, row));
+                    ACTION("Section not compiled\n");
+                    return False;
+                }
+                bzero(key.name, XkbKeyNameLength + 1);
+                strncpy(key.name, keyDef->name, XkbKeyNameLength);
+                key.defs.defined |= _GK_Name;
+            }
+            else if (!HandleComplexKey(keyDef, &key, info))
+                return False;
+            if (!AddKey(row, &key))
+                return False;
+        }
+        else
+        {
+            WSGO1("Unexpected statement (type %d) in row body\n",
+                  keyDef->common.stmtType);
+            return False;
+        }
+    }
+    return True;
+}
+
+static Bool
+HandleSectionBody(SectionDef * def,
+                  SectionInfo * si, unsigned merge, GeometryInfo * info)
+{
+    RowDef *rowDef;
+    DoodadInfo *di;
+
+    for (rowDef = def->rows; rowDef != NULL;
+         rowDef = (RowDef *) rowDef->common.next)
+    {
+        if (rowDef->common.stmtType == StmtVarDef)
+        {
+            VarDef *var = (VarDef *) rowDef;
+            ExprResult elem, field;
+            ExprDef *ndx;
+            if (ExprResolveLhs(var->name, &elem, &field, &ndx) == 0)
+                return 0;       /* internal error, already reported */
+            if ((elem.str == NULL) || (uStrCaseCmp(elem.str, "section") == 0))
+            {
+                if (!SetSectionField(si, field.str, ndx, var->value, info))
+                    return False;
+            }
+            else if (uStrCaseCmp(elem.str, "row") == 0)
+            {
+                if (!SetRowField
+                    (&si->dfltRow, field.str, ndx, var->value, info))
+                    return False;
+            }
+            else if (uStrCaseCmp(elem.str, "key") == 0)
+            {
+                if (!SetKeyField(&si->dfltRow.dfltKey, field.str, ndx,
+                                 var->value, info))
+                    return False;
+            }
+            else if ((di =
+                      FindDfltDoodadByTypeName(elem.str, si, info)) != NULL)
+            {
+                if (!SetDoodadField(di, field.str, ndx, var->value, si, info))
+                    return False;
+            }
+            else
+            {
+                WARN("Assignment to field of unknown element in section\n");
+                ACTION2("No value assigned to %s.%s\n", elem.str, field.str);
+            }
+        }
+        else if (rowDef->common.stmtType == StmtRowDef)
+        {
+            RowInfo row;
+            InitRowInfo(&row, si, info);
+            if (!HandleRowBody(rowDef, &row, merge, info))
+                return False;
+            if (!AddRow(si, &row))
+                return False;
+/*         ClearRowInfo(&row,info);*/
+        }
+        else if ((rowDef->common.stmtType == StmtDoodadDef) ||
+                 (rowDef->common.stmtType == StmtIndicatorMapDef))
+        {
+            if (!HandleDoodadDef((DoodadDef *) rowDef, merge, si, info))
+                return False;
+        }
+        else if (rowDef->common.stmtType == StmtOverlayDef)
+        {
+            if (!HandleOverlayDef((OverlayDef *) rowDef, merge, si, info))
+                return False;
+        }
+        else
+        {
+            WSGO1("Unexpected statement (type %d) in section body\n",
+                  rowDef->common.stmtType);
+            return False;
+        }
+    }
+    if (si->nRows != def->nRows)
+    {
+        WSGO2("Expected %d rows, found %d\n", (unsigned int) def->nRows,
+              (unsigned int) si->nRows);
+        ACTION1("Definition of section %s might be incorrect\n",
+                scText(info->dpy, si));
+    }
+    return True;
+}
+
+static int
+HandleSectionDef(SectionDef * def,
+                 XkbDescPtr xkb, unsigned merge, GeometryInfo * info)
+{
+    SectionInfo si;
+    char *str;
+
+    if (def->merge != MergeDefault)
+        merge = def->merge;
+    InitSectionInfo(&si, info);
+    si.defs.merge = merge;
+    str = XkbAtomGetString(NULL, def->name);
+    if ((str == NULL) || (strlen(str) < 1))
+    {
+        ERROR("Section defined without a name\n");
+        ACTION("Definition ignored\n");
+        return False;
+    }
+    si.name =
+        XkbInternAtom(info->dpy, XkbAtomGetString(NULL, def->name), False);
+    if (!HandleSectionBody(def, &si, merge, info))
+        return False;
+    if (!AddSection(info, &si))
+        return False;
+    return True;
+}
+
+/***====================================================================***/
+
+static void
+HandleGeometryFile(XkbFile * file,
+                   XkbDescPtr xkb, unsigned merge, GeometryInfo * info)
+{
+    ParseCommon *stmt;
+    char *failWhat;
+
+    if (merge == MergeDefault)
+        merge = MergeAugment;
+    info->name = uStringDup(file->name);
+    stmt = file->defs;
+    while (stmt)
+    {
+        failWhat = NULL;
+        switch (stmt->stmtType)
+        {
+        case StmtInclude:
+            if (!HandleIncludeGeometry((IncludeStmt *) stmt, xkb, info,
+                                       HandleGeometryFile))
+                info->errorCount++;
+            break;
+        case StmtKeyAliasDef:
+            if (!HandleAliasDef((KeyAliasDef *) stmt,
+                                merge, info->fileID, &info->aliases))
+            {
+                info->errorCount++;
+            }
+            break;
+        case StmtVarDef:
+            if (!HandleGeometryVar((VarDef *) stmt, xkb, info))
+                info->errorCount++;
+            break;
+        case StmtShapeDef:
+            if (!HandleShapeDef((ShapeDef *) stmt, xkb, merge, info))
+                info->errorCount++;
+            break;
+        case StmtSectionDef:
+            if (!HandleSectionDef((SectionDef *) stmt, xkb, merge, info))
+                info->errorCount++;
+            break;
+        case StmtIndicatorMapDef:
+        case StmtDoodadDef:
+            if (!HandleDoodadDef((DoodadDef *) stmt, merge, NULL, info))
+                info->errorCount++;
+            break;
+        case StmtVModDef:
+            if (!failWhat)
+                failWhat = "virtual modfier";
+        case StmtInterpDef:
+            if (!failWhat)
+                failWhat = "symbol interpretation";
+        case StmtGroupCompatDef:
+            if (!failWhat)
+                failWhat = "group compatibility map";
+        case StmtKeycodeDef:
+            if (!failWhat)
+                failWhat = "key name";
+            ERROR("Interpretation files may not include other types\n");
+            ACTION1("Ignoring %s definition.\n", failWhat);
+            info->errorCount++;
+            break;
+        default:
+            WSGO1("Unexpected statement type %d in HandleGeometryFile\n",
+                  stmt->stmtType);
+            break;
+        }
+        stmt = stmt->next;
+        if (info->errorCount > 10)
+        {
+#ifdef NOISY
+            ERROR("Too many errors\n");
+#endif
+            ACTION1("Abandoning geometry file \"%s\"\n", file->topName);
+            break;
+        }
+    }
+    return;
+}
+
+/***====================================================================***/
+
+static Bool
+CopyShapeDef(Display * dpy, XkbGeometryPtr geom, ShapeInfo * si)
+{
+    register int i, n;
+    XkbShapePtr shape;
+    XkbOutlinePtr old_outline, outline;
+    Atom name;
+
+    si->index = geom->num_shapes;
+    name = XkbInternAtom(dpy, XkbAtomGetString(NULL, si->name), False);
+    shape = XkbAddGeomShape(geom, name, si->nOutlines);
+    if (!shape)
+    {
+        WSGO("Couldn't allocate shape in geometry\n");
+        ACTION1("Shape %s not compiled\n", shText(dpy, si));
+        return False;
+    }
+    old_outline = si->outlines;
+    for (i = 0; i < si->nOutlines; i++, old_outline++)
+    {
+        outline = XkbAddGeomOutline(shape, old_outline->num_points);
+        if (!outline)
+        {
+            WSGO("Couldn't allocate outline in shape\n");
+            ACTION1("Shape %s is incomplete\n", shText(dpy, si));
+            return False;
+        }
+        n = old_outline->num_points;
+        memcpy(outline->points, old_outline->points, n * sizeof(XkbPointRec));
+        outline->num_points = old_outline->num_points;
+        outline->corner_radius = old_outline->corner_radius;
+    }
+    if (si->approx)
+    {
+        n = (si->approx - si->outlines);
+        shape->approx = &shape->outlines[n];
+    }
+    if (si->primary)
+    {
+        n = (si->primary - si->outlines);
+        shape->primary = &shape->outlines[n];
+    }
+    XkbComputeShapeBounds(shape);
+    return True;
+}
+
+static Bool
+VerifyDoodadInfo(DoodadInfo * di, GeometryInfo * info)
+{
+    if ((di->defs.defined & (_GD_Top | _GD_Left)) != (_GD_Top | _GD_Left))
+    {
+        if (warningLevel < 9)
+        {
+            ERROR1("No position defined for doodad %s\n",
+                   ddText(info->dpy, di));
+            ACTION("Illegal doodad ignored\n");
+            return False;
+        }
+    }
+    if ((di->defs.defined & _GD_Priority) == 0)
+    {
+        /* calculate priority -- should be just above previous doodad/row */
+    }
+    switch (di->type)
+    {
+    case XkbOutlineDoodad:
+    case XkbSolidDoodad:
+        if ((di->defs.defined & _GD_Shape) == 0)
+        {
+            ERROR2("No shape defined for %s doodad %s\n",
+                   (di->type == XkbOutlineDoodad ? "outline" : "filled"),
+                   ddText(info->dpy, di));
+            ACTION("Incomplete definition ignored\n");
+            return False;
+        }
+        else
+        {
+            ShapeInfo *si;
+            si = FindShape(info, di->shape,
+                           (di->type ==
+                            XkbOutlineDoodad ? "outline doodad" :
+                            "solid doodad"), ddText(info->dpy, di));
+            if (si)
+                di->shape = si->name;
+            else
+            {
+                ERROR1("No legal shape for %s\n", ddText(info->dpy, di));
+                ACTION("Incomplete definition ignored\n");
+                return False;
+            }
+        }
+        if ((di->defs.defined & _GD_Color) == 0)
+        {
+            if (warningLevel > 5)
+            {
+                WARN1("No color for doodad %s\n", ddText(info->dpy, di));
+                ACTION("Using black\n");
+            }
+            di->color = XkbInternAtom(NULL, "black", False);
+        }
+        break;
+    case XkbTextDoodad:
+        if ((di->defs.defined & _GD_Text) == 0)
+        {
+            ERROR1("No text specified for text doodad %s\n",
+                   ddText(info->dpy, di));
+            ACTION("Illegal doodad definition ignored\n");
+            return False;
+        }
+        if ((di->defs.defined & _GD_Angle) == 0)
+            di->angle = 0;
+        if ((di->defs.defined & _GD_Color) == 0)
+        {
+            if (warningLevel > 5)
+            {
+                WARN1("No color specified for doodad %s\n",
+                      ddText(info->dpy, di));
+                ACTION("Using black\n");
+            }
+            di->color = XkbInternAtom(NULL, "black", False);
+        }
+        if ((di->defs.defined & _GD_FontSpec) != 0)
+        {
+            if ((di->defs.defined & _GD_FontParts) == 0)
+                return True;
+            if (warningLevel < 9)
+            {
+                WARN1
+                    ("Text doodad %s has full and partial font definition\n",
+                     ddText(info->dpy, di));
+                ACTION("Full specification ignored\n");
+            }
+            di->defs.defined &= ~_GD_FontSpec;
+            di->fontSpec = None;
+        }
+        if ((di->defs.defined & _GD_Font) == 0)
+        {
+            if (warningLevel > 5)
+            {
+                WARN1("No font specified for doodad %s\n",
+                      ddText(info->dpy, di));
+                ACTION1("Using \"%s\"\n", DFLT_FONT);
+            }
+            di->font = XkbInternAtom(NULL, DFLT_FONT, False);
+        }
+        if ((di->defs.defined & _GD_FontSlant) == 0)
+        {
+            if (warningLevel > 7)
+            {
+                WARN1("No font slant for text doodad %s\n",
+                      ddText(info->dpy, di));
+                ACTION1("Using \"%s\"\n", DFLT_SLANT);
+            }
+            di->fontSlant = XkbInternAtom(NULL, DFLT_SLANT, False);
+        }
+        if ((di->defs.defined & _GD_FontWeight) == 0)
+        {
+            if (warningLevel > 7)
+            {
+                WARN1("No font weight for text doodad %s\n",
+                      ddText(info->dpy, di));
+                ACTION1("Using \"%s\"\n", DFLT_WEIGHT);
+            }
+            di->fontWeight = XkbInternAtom(NULL, DFLT_WEIGHT, False);
+        }
+        if ((di->defs.defined & _GD_FontSetWidth) == 0)
+        {
+            if (warningLevel > 9)
+            {
+                WARN1("No font set width for text doodad %s\n",
+                      ddText(info->dpy, di));
+                ACTION1("Using \"%s\"\n", DFLT_SET_WIDTH);
+            }
+            di->fontSetWidth = XkbInternAtom(NULL, DFLT_SET_WIDTH, False);
+        }
+        if ((di->defs.defined & _GD_FontVariant) == 0)
+        {
+            if (warningLevel > 9)
+            {
+                WARN1("No font variant for text doodad %s\n",
+                      ddText(info->dpy, di));
+                ACTION1("Using \"%s\"\n", DFLT_VARIANT);
+            }
+            di->fontVariant = XkbInternAtom(NULL, DFLT_VARIANT, False);
+        }
+        if ((di->defs.defined & _GD_FontEncoding) == 0)
+        {
+            if (warningLevel > 7)
+            {
+                WARN1("No font encoding for doodad %s\n",
+                      ddText(info->dpy, di));
+                ACTION1("Using \"%s\"\n", DFLT_ENCODING);
+            }
+            di->fontEncoding = XkbInternAtom(NULL, DFLT_ENCODING, False);
+        }
+        if ((di->defs.defined & _GD_FontSize) == 0)
+        {
+            if (warningLevel > 7)
+            {
+                WARN1("No font size for text doodad %s\n",
+                      ddText(info->dpy, di));
+                ACTION1("Using %s point text\n",
+                        XkbGeomFPText(DFLT_SIZE, XkbMessage));
+            }
+            di->fontSize = DFLT_SIZE;
+        }
+        if ((di->defs.defined & _GD_Height) == 0)
+        {
+            unsigned size, nLines;
+            char *tmp;
+            size = (di->fontSize * 120) / 100;
+            size = (size * 254) / 720;  /* convert to mm/10 */
+            for (nLines = 1, tmp = XkbAtomGetString(NULL, di->text); *tmp;
+                 tmp++)
+            {
+                if (*tmp == '\n')
+                    nLines++;
+            }
+            size *= nLines;
+            if (warningLevel > 5)
+            {
+                WARN1("No height for text doodad %s\n",
+                      ddText(info->dpy, di));
+                ACTION1("Using calculated height %s millimeters\n",
+                        XkbGeomFPText(size, XkbMessage));
+            }
+            di->height = size;
+        }
+        if ((di->defs.defined & _GD_Width) == 0)
+        {
+            unsigned width, tmp;
+            char *str;
+            width = tmp = 0;
+            for (str = XkbAtomGetString(NULL, di->text); *str; str++)
+            {
+                if (*str != '\n')
+                    tmp++;
+                else
+                {
+                    if (tmp > width)
+                        width = tmp;
+                    tmp = 1;
+                }
+            }
+            if (width == 0)
+                width = tmp;
+            width *= (di->height * 2) / 3;
+            if (warningLevel > 5)
+            {
+                WARN1("No width for text doodad %s\n", ddText(info->dpy, di));
+                ACTION1("Using calculated width %s millimeters\n",
+                        XkbGeomFPText(width, XkbMessage));
+            }
+            di->width = width;
+        }
+        break;
+    case XkbIndicatorDoodad:
+        if ((di->defs.defined & _GD_Shape) == 0)
+        {
+            ERROR1("No shape defined for indicator doodad %s\n",
+                   ddText(info->dpy, di));
+            ACTION("Incomplete definition ignored\n");
+            return False;
+        }
+        else
+        {
+            ShapeInfo *si;
+            si = FindShape(info, di->shape, "indicator doodad",
+                           ddText(info->dpy, di));
+            if (si)
+                di->shape = si->name;
+            else
+            {
+                ERROR1("No legal shape for doodad %s\n",
+                       ddText(info->dpy, di));
+                ACTION("Incomplete definition ignored\n");
+                return False;
+            }
+        }
+        if ((di->defs.defined & _GD_Color) == 0)
+        {
+            if (warningLevel > 5)
+            {
+                WARN1("No \"on\" color for indicator doodad %s\n",
+                      ddText(info->dpy, di));
+                ACTION("Using green\n");
+            }
+            di->color = XkbInternAtom(NULL, "green", False);
+        }
+        if ((di->defs.defined & _GD_OffColor) == 0)
+        {
+            if (warningLevel > 5)
+            {
+                WARN1("No \"off\" color for indicator doodad %s\n",
+                      ddText(info->dpy, di));
+                ACTION("Using black\n");
+            }
+            di->offColor = XkbInternAtom(NULL, "black", False);
+        }
+        break;
+    case XkbLogoDoodad:
+        if (di->logoName == NULL)
+        {
+            ERROR1("No logo name defined for logo doodad %s\n",
+                   ddText(info->dpy, di));
+            ACTION("Incomplete definition ignored\n");
+            return False;
+        }
+        if ((di->defs.defined & _GD_Shape) == 0)
+        {
+            ERROR1("No shape defined for logo doodad %s\n",
+                   ddText(info->dpy, di));
+            ACTION("Incomplete definition ignored\n");
+            return False;
+        }
+        else
+        {
+            ShapeInfo *si;
+            si = FindShape(info, di->shape, "logo doodad",
+                           ddText(info->dpy, di));
+            if (si)
+                di->shape = si->name;
+            else
+            {
+                ERROR1("No legal shape for %s\n", ddText(info->dpy, di));
+                ACTION("Incomplete definition ignored\n");
+                return False;
+            }
+        }
+        if ((di->defs.defined & _GD_Color) == 0)
+        {
+            if (warningLevel > 5)
+            {
+                WARN1("No color for doodad %s\n", ddText(info->dpy, di));
+                ACTION("Using black\n");
+            }
+            di->color = XkbInternAtom(NULL, "black", False);
+        }
+        break;
+    default:
+        WSGO1("Uknown doodad type %d in VerifyDoodad\n",
+              (unsigned int) di->type);
+        return False;
+    }
+    return True;
+}
+
+#define        FONT_TEMPLATE   "-*-%s-%s-%s-%s-%s-*-%d-*-*-*-*-%s"
+
+static char *
+FontFromParts(Atom fontTok,
+              Atom weightTok,
+              Atom slantTok,
+              Atom setWidthTok, Atom varTok, int size, Atom encodingTok)
+{
+    int totalSize;
+    char *font, *weight, *slant, *setWidth, *variant, *encoding;
+    char *rtrn;
+
+    font = (fontTok != None ? XkbAtomGetString(NULL, fontTok) : DFLT_FONT);
+    weight =
+        (weightTok != None ? XkbAtomGetString(NULL, weightTok) : DFLT_WEIGHT);
+    slant =
+        (slantTok != None ? XkbAtomGetString(NULL, slantTok) : DFLT_SLANT);
+    setWidth =
+        (setWidthTok !=
+         None ? XkbAtomGetString(NULL, setWidthTok) : DFLT_SET_WIDTH);
+    variant =
+        (varTok != None ? XkbAtomGetString(NULL, varTok) : DFLT_VARIANT);
+    encoding =
+        (encodingTok !=
+         None ? XkbAtomGetString(NULL, encodingTok) : DFLT_ENCODING);
+    if (size == 0)
+        size = DFLT_SIZE;
+    totalSize =
+        strlen(FONT_TEMPLATE) + strlen(font) + strlen(weight) + strlen(slant);
+    totalSize += strlen(setWidth) + strlen(variant) + strlen(encoding);
+    rtrn = uCalloc(totalSize, 1);
+    if (rtrn)
+    {
+        sprintf(rtrn, FONT_TEMPLATE, font, weight, slant, setWidth, variant,
+                size, encoding);
+    }
+    return rtrn;
+}
+
+static Bool
+CopyDoodadDef(XkbGeometryPtr geom,
+              XkbSectionPtr section, DoodadInfo * di, GeometryInfo * info)
+{
+    Atom name;
+    XkbDoodadPtr doodad;
+    XkbColorPtr color;
+    XkbShapePtr shape;
+    ShapeInfo *si;
+
+    if (!VerifyDoodadInfo(di, info))
+        return False;
+    name = XkbInternAtom(NULL, XkbAtomGetString(NULL, di->name), False);
+    doodad = XkbAddGeomDoodad(geom, section, name);
+    if (!doodad)
+    {
+        WSGO1("Couldn't allocate doodad in %s\n",
+              (section ? "section" : "geometry"));
+        ACTION1("Cannot copy doodad %s\n", ddText(info->dpy, di));
+        return False;
+    }
+    doodad->any.type = di->type;
+    doodad->any.priority = di->priority;
+    doodad->any.top = di->top;
+    doodad->any.left = di->left;
+    switch (di->type)
+    {
+    case XkbOutlineDoodad:
+    case XkbSolidDoodad:
+        si = FindShape(info, di->shape, NULL, NULL);
+        if (!si)
+            return False;
+        doodad->shape.angle = di->angle;
+        color =
+            XkbAddGeomColor(geom, XkbAtomGetString(NULL, di->color),
+                            geom->num_colors);
+        shape = &geom->shapes[si->index];
+        XkbSetShapeDoodadColor(geom, &doodad->shape, color);
+        XkbSetShapeDoodadShape(geom, &doodad->shape, shape);
+        break;
+    case XkbTextDoodad:
+        doodad->text.angle = di->angle;
+        doodad->text.width = di->width;
+        doodad->text.height = di->height;
+        if (di->fontSpec == None)
+            doodad->text.font = FontFromParts(di->font, di->fontWeight,
+                                              di->fontSlant,
+                                              di->fontSetWidth,
+                                              di->fontVariant, di->fontSize,
+                                              di->fontEncoding);
+        else
+            doodad->text.font = XkbAtomGetString(NULL, di->fontSpec);
+        doodad->text.text = XkbAtomGetString(NULL, di->text);
+        color =
+            XkbAddGeomColor(geom, XkbAtomGetString(NULL, di->color),
+                            geom->num_colors);
+        XkbSetTextDoodadColor(geom, &doodad->text, color);
+        break;
+    case XkbIndicatorDoodad:
+        si = FindShape(info, di->shape, NULL, NULL);
+        if (!si)
+            return False;
+        shape = &geom->shapes[si->index];
+        color =
+            XkbAddGeomColor(geom, XkbAtomGetString(NULL, di->color),
+                            geom->num_colors);
+        XkbSetIndicatorDoodadShape(geom, &doodad->indicator, shape);
+        XkbSetIndicatorDoodadOnColor(geom, &doodad->indicator, color);
+        color =
+            XkbAddGeomColor(geom, XkbAtomGetString(NULL, di->offColor),
+                            geom->num_colors);
+        XkbSetIndicatorDoodadOffColor(geom, &doodad->indicator, color);
+        break;
+    case XkbLogoDoodad:
+        si = FindShape(info, di->shape, NULL, NULL);
+        if (!si)
+            return False;
+        doodad->logo.angle = di->angle;
+        color =
+            XkbAddGeomColor(geom, XkbAtomGetString(NULL, di->color),
+                            geom->num_colors);
+        shape = &geom->shapes[si->index];
+        XkbSetLogoDoodadColor(geom, &doodad->logo, color);
+        XkbSetLogoDoodadShape(geom, &doodad->logo, shape);
+        doodad->logo.logo_name = di->logoName;
+        di->logoName = NULL;
+        break;
+    }
+    return True;
+}
+
+/***====================================================================***/
+
+static Bool
+VerifyOverlayInfo(XkbGeometryPtr geom,
+                  XkbSectionPtr section,
+                  OverlayInfo * oi,
+                  GeometryInfo * info, short rowMap[256], short rowSize[256])
+{
+    register OverlayKeyInfo *ki, *next;
+    unsigned long oKey, uKey, sKey;
+    XkbRowPtr row;
+    XkbKeyPtr key;
+    int r, k;
+
+    /* find out which row each key is in */
+    for (ki = oi->keys; ki != NULL; ki = (OverlayKeyInfo *) ki->defs.next)
+    {
+        oKey = KeyNameToLong(ki->over);
+        uKey = KeyNameToLong(ki->under);
+        for (r = 0, row = section->rows; (r < section->num_rows) && oKey;
+             r++, row++)
+        {
+            for (k = 0, key = row->keys; (k < row->num_keys) && oKey;
+                 k++, key++)
+            {
+                sKey = KeyNameToLong(key->name.name);
+                if (sKey == oKey)
+                {
+                    if (warningLevel > 0)
+                    {
+                        WARN3
+                            ("Key %s in section \"%s\" and overlay \"%s\"\n",
+                             XkbKeyNameText(key->name.name,
+                                            XkbMessage),
+                             XkbAtomText(info->dpy, section->name,
+                                         XkbMessage),
+                             XkbAtomText(info->dpy, oi->name, XkbMessage));
+                        ACTION("Overlay definition ignored\n");
+                    }
+                    oKey = 0;
+                }
+                else if (sKey == uKey)
+                {
+                    ki->sectionRow = r;
+                    oKey = 0;
+                }
+            }
+        }
+        if ((ki->sectionRow == _GOK_UnknownRow) && (warningLevel > 0))
+        {
+            WARN3
+                ("Key %s not in \"%s\", but has an overlay key in \"%s\"\n",
+                 XkbKeyNameText(ki->under, XkbMessage),
+                 XkbAtomText(info->dpy, section->name, XkbMessage),
+                 XkbAtomText(info->dpy, oi->name, XkbMessage));
+            ACTION("Definition ignored\n");
+        }
+    }
+    /* now prune out keys that aren't in the section */
+    while ((oi->keys != NULL) && (oi->keys->sectionRow == _GOK_UnknownRow))
+    {
+        next = (OverlayKeyInfo *) oi->keys->defs.next;
+        uFree(oi->keys);
+        oi->keys = next;
+        oi->nKeys--;
+    }
+    for (ki = oi->keys; (ki != NULL) && (ki->defs.next != NULL); ki = next)
+    {
+        next = (OverlayKeyInfo *) ki->defs.next;
+        if (next->sectionRow == _GOK_UnknownRow)
+        {
+            ki->defs.next = next->defs.next;
+            oi->nKeys--;
+            uFree(next);
+            next = (OverlayKeyInfo *) ki->defs.next;
+        }
+    }
+    if (oi->nKeys < 1)
+    {
+        ERROR2("Overlay \"%s\" for section \"%s\" has no legal keys\n",
+               XkbAtomText(info->dpy, oi->name, XkbMessage),
+               XkbAtomText(info->dpy, section->name, XkbMessage));
+        ACTION("Overlay definition ignored\n");
+        return False;
+    }
+    /* now figure out how many rows are defined for the overlay */
+    bzero(rowSize, sizeof(short) * 256);
+    for (k = 0; k < 256; k++)
+    {
+        rowMap[k] = -1;
+    }
+    oi->nRows = 0;
+    for (ki = oi->keys; ki != NULL; ki = (OverlayKeyInfo *) ki->defs.next)
+    {
+        if (rowMap[ki->sectionRow] == -1)
+            rowMap[ki->sectionRow] = oi->nRows++;
+        ki->overlayRow = rowMap[ki->sectionRow];
+        rowSize[ki->overlayRow]++;
+    }
+    return True;
+}
+
+static Bool
+CopyOverlayDef(XkbGeometryPtr geom,
+               XkbSectionPtr section, OverlayInfo * oi, GeometryInfo * info)
+{
+    Atom name;
+    XkbOverlayPtr ol;
+    XkbOverlayRowPtr row;
+    XkbOverlayKeyPtr key;
+    OverlayKeyInfo *ki;
+    short rowMap[256], rowSize[256];
+    int i;
+
+    if (!VerifyOverlayInfo(geom, section, oi, info, rowMap, rowSize))
+        return False;
+    name = XkbInternAtom(NULL, XkbAtomGetString(NULL, oi->name), False);
+    ol = XkbAddGeomOverlay(section, name, oi->nRows);
+    if (!ol)
+    {
+        WSGO2("Couldn't add overlay \"%s\" to section \"%s\"\n",
+              XkbAtomText(info->dpy, name, XkbMessage),
+              XkbAtomText(info->dpy, section->name, XkbMessage));
+        return False;
+    }
+    for (i = 0; i < oi->nRows; i++)
+    {
+        int tmp, row_under;
+        for (tmp = 0, row_under = -1;
+             (tmp < section->num_rows) && (row_under < 0); tmp++)
+        {
+            if (rowMap[tmp] == i)
+                row_under = tmp;
+        }
+        if (!XkbAddGeomOverlayRow(ol, row_under, rowSize[i]))
+        {
+            WSGO3
+                ("Can't add row %d to overlay \"%s\" of section \"%s\"\n",
+                 i, XkbAtomText(info->dpy, name, XkbMessage),
+                 XkbAtomText(info->dpy, section->name, XkbMessage));
+            return False;
+        }
+    }
+    for (ki = oi->keys; ki != NULL; ki = (OverlayKeyInfo *) ki->defs.next)
+    {
+        row = &ol->rows[ki->overlayRow];
+        key = &row->keys[row->num_keys++];
+        bzero(key, sizeof(XkbOverlayKeyRec));
+        strncpy(key->over.name, ki->over, XkbKeyNameLength);
+        strncpy(key->under.name, ki->under, XkbKeyNameLength);
+    }
+    return True;
+}
+
+/***====================================================================***/
+
+static Bool
+CopySectionDef(XkbGeometryPtr geom, SectionInfo * si, GeometryInfo * info)
+{
+    XkbSectionPtr section;
+    XkbRowPtr row;
+    XkbKeyPtr key;
+    KeyInfo *ki;
+    RowInfo *ri;
+    Atom name;
+
+    name = XkbInternAtom(NULL, XkbAtomGetString(NULL, si->name), False);
+    section =
+        XkbAddGeomSection(geom, name, si->nRows, si->nDoodads, si->nOverlays);
+    if (section == NULL)
+    {
+        WSGO("Couldn't allocate section in geometry\n");
+        ACTION1("Section %s not compiled\n", scText(info->dpy, si));
+        return False;
+    }
+    section->top = si->top;
+    section->left = si->left;
+    section->width = si->width;
+    section->height = si->height;
+    section->angle = si->angle;
+    section->priority = si->priority;
+    for (ri = si->rows; ri != NULL; ri = (RowInfo *) ri->defs.next)
+    {
+        row = XkbAddGeomRow(section, ri->nKeys);
+        if (row == NULL)
+        {
+            WSGO("Couldn't allocate row in section\n");
+            ACTION1("Section %s is incomplete\n", scText(info->dpy, si));
+            return False;
+        }
+        row->top = ri->top;
+        row->left = ri->left;
+        row->vertical = ri->vertical;
+        for (ki = ri->keys; ki != NULL; ki = (KeyInfo *) ki->defs.next)
+        {
+            XkbColorPtr color;
+            if ((ki->defs.defined & _GK_Name) == 0)
+            {
+                ERROR3("Key %d of row %d in section %s has no name\n",
+                       (int) ki->index, (int) ri->index,
+                       scText(info->dpy, si));
+                ACTION1("Section %s ignored\n", scText(info->dpy, si));
+                return False;
+            }
+            key = XkbAddGeomKey(row);
+            if (key == NULL)
+            {
+                WSGO("Couldn't allocate key in row\n");
+                ACTION1("Section %s is incomplete\n", scText(info->dpy, si));
+                return False;
+            }
+            memcpy(key->name.name, ki->name, XkbKeyNameLength);
+            key->gap = ki->gap;
+            if (ki->shape == None)
+                key->shape_ndx = 0;
+            else
+            {
+                ShapeInfo *sinfo;
+                sinfo = FindShape(info, ki->shape, "key", keyText(ki));
+                if (!sinfo)
+                    return False;
+                key->shape_ndx = sinfo->index;
+            }
+            if (ki->color != None)
+                color =
+                    XkbAddGeomColor(geom,
+                                    XkbAtomGetString(NULL, ki->color),
+                                    geom->num_colors);
+            else
+                color = XkbAddGeomColor(geom, "white", geom->num_colors);
+            XkbSetKeyColor(geom, key, color);
+        }
+    }
+    if (si->doodads != NULL)
+    {
+        DoodadInfo *di;
+        for (di = si->doodads; di != NULL; di = (DoodadInfo *) di->defs.next)
+        {
+            CopyDoodadDef(geom, section, di, info);
+        }
+    }
+    if (si->overlays != NULL)
+    {
+        OverlayInfo *oi;
+        for (oi = si->overlays; oi != NULL;
+             oi = (OverlayInfo *) oi->defs.next)
+        {
+            CopyOverlayDef(geom, section, oi, info);
+        }
+    }
+    if (XkbComputeSectionBounds(geom, section))
+    {
+        /* 7/6/94 (ef) --  check for negative origin and translate */
+        if ((si->defs.defined & _GS_Width) == 0)
+            section->width = section->bounds.x2;
+        if ((si->defs.defined & _GS_Height) == 0)
+            section->height = section->bounds.y2;
+    }
+    return True;
+}
+
+/***====================================================================***/
+
+Bool
+CompileGeometry(XkbFile * file, XkbFileInfo * result, unsigned merge)
+{
+    GeometryInfo info;
+    XkbDescPtr xkb;
+
+    xkb = result->xkb;
+    InitGeometryInfo(&info, file->id, merge);
+    info.dpy = xkb->dpy;
+    HandleGeometryFile(file, xkb, merge, &info);
+
+    if (info.errorCount == 0)
+    {
+        XkbGeometryPtr geom;
+        XkbGeometrySizesRec sizes;
+        bzero(&sizes, sizeof(sizes));
+        sizes.which = XkbGeomAllMask;
+        sizes.num_properties = info.nProps;
+        sizes.num_colors = 8;
+        sizes.num_shapes = info.nShapes;
+        sizes.num_sections = info.nSections;
+        sizes.num_doodads = info.nDoodads;
+        if (XkbAllocGeometry(xkb, &sizes) != Success)
+        {
+            WSGO("Couldn't allocate GeometryRec\n");
+            ACTION("Geometry not compiled\n");
+            return False;
+        }
+        geom = xkb->geom;
+
+        geom->width_mm = info.widthMM;
+        geom->height_mm = info.heightMM;
+        if (info.name != NULL)
+        {
+            geom->name = XkbInternAtom(xkb->dpy, info.name, False);
+            if (XkbAllocNames(xkb, XkbGeometryNameMask, 0, 0) == Success)
+                xkb->names->geometry = geom->name;
+        }
+        if (info.fontSpec != None)
+            geom->label_font =
+                uStringDup(XkbAtomGetString(NULL, info.fontSpec));
+        else
+            geom->label_font = FontFromParts(info.font, info.fontWeight,
+                                             info.fontSlant,
+                                             info.fontSetWidth,
+                                             info.fontVariant,
+                                             info.fontSize,
+                                             info.fontEncoding);
+        XkbAddGeomColor(geom, "black", geom->num_colors);
+        XkbAddGeomColor(geom, "white", geom->num_colors);
+
+        if (info.baseColor == None)
+            info.baseColor = XkbInternAtom(NULL, "white", False);
+        if (info.labelColor == None)
+            info.labelColor = XkbInternAtom(NULL, "black", False);
+        geom->base_color =
+            XkbAddGeomColor(geom, XkbAtomGetString(NULL, info.baseColor),
+                            geom->num_colors);
+        geom->label_color =
+            XkbAddGeomColor(geom, XkbAtomGetString(NULL, info.labelColor),
+                            geom->num_colors);
+
+        if (info.props)
+        {
+            PropertyInfo *pi;
+            for (pi = info.props; pi != NULL;
+                 pi = (PropertyInfo *) pi->defs.next)
+            {
+                if (!XkbAddGeomProperty(geom, pi->name, pi->value))
+                    return False;
+            }
+        }
+        if (info.shapes)
+        {
+            ShapeInfo *si;
+            for (si = info.shapes; si != NULL;
+                 si = (ShapeInfo *) si->defs.next)
+            {
+                if (!CopyShapeDef(xkb->dpy, geom, si))
+                    return False;
+            }
+        }
+        if (info.sections)
+        {
+            SectionInfo *si;
+            for (si = info.sections; si != NULL;
+                 si = (SectionInfo *) si->defs.next)
+            {
+                if (!CopySectionDef(geom, si, &info))
+                    return False;
+            }
+        }
+        if (info.doodads)
+        {
+            DoodadInfo *di;
+            for (di = info.doodads; di != NULL;
+                 di = (DoodadInfo *) di->defs.next)
+            {
+                if (!CopyDoodadDef(geom, NULL, di, &info))
+                    return False;
+            }
+        }
+        if (info.aliases)
+            ApplyAliases(xkb, True, &info.aliases);
+        ClearGeometryInfo(&info);
+        return True;
+    }
+    return False;
+}
diff --git a/indicators.c b/indicators.c
new file mode 100644 (file)
index 0000000..d4a362f
--- /dev/null
@@ -0,0 +1,575 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 "xkbcomp.h"
+#include "misc.h"
+#include "tokens.h"
+#include "expr.h"
+#include "vmod.h"
+#include "indicators.h"
+#include "action.h"
+#include "compat.h"
+
+/***====================================================================***/
+
+#define        ReportIndicatorBadType(d,l,f,w) \
+               ReportBadType("indicator map",(f),\
+                       XkbAtomText((d),(l)->name,XkbMessage),(w))
+#define        ReportIndicatorNotArray(d,l,f)  \
+               ReportNotArray("indicator map",(f),\
+                       XkbAtomText((d),(l)->name,XkbMessage))
+
+/***====================================================================***/
+
+void
+ClearIndicatorMapInfo(Display * dpy, LEDInfo * info)
+{
+    info->name = XkbInternAtom(dpy, "default", False);
+    info->indicator = _LED_NotBound;
+    info->flags = info->which_mods = info->real_mods = 0;
+    info->vmods = 0;
+    info->which_groups = info->groups = 0;
+    info->ctrls = 0;
+    return;
+}
+
+LEDInfo *
+AddIndicatorMap(LEDInfo * oldLEDs, LEDInfo * new)
+{
+    LEDInfo *old, *last;
+    unsigned collide;
+
+    last = NULL;
+    for (old = oldLEDs; old != NULL; old = (LEDInfo *) old->defs.next)
+    {
+        if (old->name == new->name)
+        {
+            if ((old->real_mods == new->real_mods) &&
+                (old->vmods == new->vmods) &&
+                (old->groups == new->groups) &&
+                (old->ctrls == new->ctrls) &&
+                (old->which_mods == new->which_mods) &&
+                (old->which_groups == new->which_groups))
+            {
+                old->defs.defined |= new->defs.defined;
+                return oldLEDs;
+            }
+            if (new->defs.merge == MergeReplace)
+            {
+                CommonInfo *next = old->defs.next;
+                if (((old->defs.fileID == new->defs.fileID)
+                     && (warningLevel > 0)) || (warningLevel > 9))
+                {
+                    WARN1("Map for indicator %s redefined\n",
+                          XkbAtomText(NULL, old->name, XkbMessage));
+                    ACTION("Earlier definition ignored\n");
+                }
+                *old = *new;
+                old->defs.next = next;
+                return oldLEDs;
+            }
+            collide = 0;
+            if (UseNewField(_LED_Index, &old->defs, &new->defs, &collide))
+            {
+                old->indicator = new->indicator;
+                old->defs.defined |= _LED_Index;
+            }
+            if (UseNewField(_LED_Mods, &old->defs, &new->defs, &collide))
+            {
+                old->which_mods = new->which_mods;
+                old->real_mods = new->real_mods;
+                old->vmods = new->vmods;
+                old->defs.defined |= _LED_Mods;
+            }
+            if (UseNewField(_LED_Groups, &old->defs, &new->defs, &collide))
+            {
+                old->which_groups = new->which_groups;
+                old->groups = new->groups;
+                old->defs.defined |= _LED_Groups;
+            }
+            if (UseNewField(_LED_Ctrls, &old->defs, &new->defs, &collide))
+            {
+                old->ctrls = new->ctrls;
+                old->defs.defined |= _LED_Ctrls;
+            }
+            if (UseNewField(_LED_Explicit, &old->defs, &new->defs, &collide))
+            {
+                old->flags &= ~XkbIM_NoExplicit;
+                old->flags |= (new->flags & XkbIM_NoExplicit);
+                old->defs.defined |= _LED_Explicit;
+            }
+            if (UseNewField(_LED_Automatic, &old->defs, &new->defs, &collide))
+            {
+                old->flags &= ~XkbIM_NoAutomatic;
+                old->flags |= (new->flags & XkbIM_NoAutomatic);
+                old->defs.defined |= _LED_Automatic;
+            }
+            if (UseNewField(_LED_DrivesKbd, &old->defs, &new->defs, &collide))
+            {
+                old->flags &= ~XkbIM_LEDDrivesKB;
+                old->flags |= (new->flags & XkbIM_LEDDrivesKB);
+                old->defs.defined |= _LED_DrivesKbd;
+            }
+            if (collide)
+            {
+                WARN1("Map for indicator %s redefined\n",
+                      XkbAtomText(NULL, old->name, XkbMessage));
+                ACTION1("Using %s definition for duplicate fields\n",
+                        (new->defs.merge == MergeAugment ? "first" : "last"));
+            }
+            return oldLEDs;
+        }
+        if (old->defs.next == NULL)
+            last = old;
+    }
+    /* new definition */
+    old = uTypedAlloc(LEDInfo);
+    if (!old)
+    {
+        WSGO("Couldn't allocate indicator map\n");
+        ACTION1("Map for indicator %s not compiled\n",
+                XkbAtomText(NULL, new->name, XkbMessage));
+        return NULL;
+    }
+    *old = *new;
+    old->defs.next = NULL;
+    if (last)
+    {
+        last->defs.next = &old->defs;
+        return oldLEDs;
+    }
+    return old;
+}
+
+static LookupEntry modComponentNames[] = {
+    {"base", XkbIM_UseBase}
+    ,
+    {"latched", XkbIM_UseLatched}
+    ,
+    {"locked", XkbIM_UseLocked}
+    ,
+    {"effective", XkbIM_UseEffective}
+    ,
+    {"compat", XkbIM_UseCompat}
+    ,
+    {"any", XkbIM_UseAnyMods}
+    ,
+    {"none", 0}
+    ,
+    {NULL, 0}
+};
+static LookupEntry groupComponentNames[] = {
+    {"base", XkbIM_UseBase}
+    ,
+    {"latched", XkbIM_UseLatched}
+    ,
+    {"locked", XkbIM_UseLocked}
+    ,
+    {"effective", XkbIM_UseEffective}
+    ,
+    {"any", XkbIM_UseAnyGroup}
+    ,
+    {"none", 0}
+    ,
+    {NULL, 0}
+};
+
+int
+SetIndicatorMapField(LEDInfo * led,
+                     XkbDescPtr xkb,
+                     char *field, ExprDef * arrayNdx, ExprDef * value)
+{
+    ExprResult rtrn;
+    Bool ok;
+
+    ok = True;
+    if ((uStrCaseCmp(field, "modifiers") == 0)
+        || (uStrCaseCmp(field, "mods") == 0))
+    {
+        if (arrayNdx != NULL)
+            return ReportIndicatorNotArray(xkb->dpy, led, field);
+        if (!ExprResolveModMask(value, &rtrn, LookupVModMask, (XPointer) xkb))
+            return ReportIndicatorBadType(xkb->dpy, led, field,
+                                          "modifier mask");
+        led->real_mods = rtrn.uval & 0xff;
+        led->vmods = (rtrn.uval >> 8) & 0xff;
+        led->defs.defined |= _LED_Mods;
+    }
+    else if (uStrCaseCmp(field, "groups") == 0)
+    {
+        if (arrayNdx != NULL)
+            return ReportIndicatorNotArray(xkb->dpy, led, field);
+        if (!ExprResolveMask
+            (value, &rtrn, SimpleLookup, (XPointer) groupNames))
+            return ReportIndicatorBadType(xkb->dpy, led, field, "group mask");
+        led->groups = rtrn.uval;
+        led->defs.defined |= _LED_Groups;
+    }
+    else if ((uStrCaseCmp(field, "controls") == 0) ||
+             (uStrCaseCmp(field, "ctrls") == 0))
+    {
+        if (arrayNdx != NULL)
+            return ReportIndicatorNotArray(xkb->dpy, led, field);
+        if (!ExprResolveMask
+            (value, &rtrn, SimpleLookup, (XPointer) ctrlNames))
+            return ReportIndicatorBadType(xkb->dpy, led, field,
+                                          "controls mask");
+        led->ctrls = rtrn.uval;
+        led->defs.defined |= _LED_Ctrls;
+    }
+    else if (uStrCaseCmp(field, "allowexplicit") == 0)
+    {
+        if (arrayNdx != NULL)
+            return ReportIndicatorNotArray(xkb->dpy, led, field);
+        if (!ExprResolveBoolean(value, &rtrn, NULL, NULL))
+            return ReportIndicatorBadType(xkb->dpy, led, field, "boolean");
+        if (rtrn.uval)
+            led->flags &= ~XkbIM_NoExplicit;
+        else
+            led->flags |= XkbIM_NoExplicit;
+        led->defs.defined |= _LED_Explicit;
+    }
+    else if ((uStrCaseCmp(field, "whichmodstate") == 0) ||
+             (uStrCaseCmp(field, "whichmodifierstate") == 0))
+    {
+        if (arrayNdx != NULL)
+            return ReportIndicatorNotArray(xkb->dpy, led, field);
+        if (!ExprResolveMask(value, &rtrn, SimpleLookup,
+                             (XPointer) modComponentNames))
+        {
+            return ReportIndicatorBadType(xkb->dpy, led, field,
+                                          "mask of modifier state components");
+        }
+        led->which_mods = rtrn.uval;
+    }
+    else if (uStrCaseCmp(field, "whichgroupstate") == 0)
+    {
+        if (arrayNdx != NULL)
+            return ReportIndicatorNotArray(xkb->dpy, led, field);
+        if (!ExprResolveMask(value, &rtrn, SimpleLookup,
+                             (XPointer) groupComponentNames))
+        {
+            return ReportIndicatorBadType(xkb->dpy, led, field,
+                                          "mask of group state components");
+        }
+        led->which_groups = rtrn.uval;
+    }
+    else if ((uStrCaseCmp(field, "driveskbd") == 0) ||
+             (uStrCaseCmp(field, "driveskeyboard") == 0) ||
+             (uStrCaseCmp(field, "leddriveskbd") == 0) ||
+             (uStrCaseCmp(field, "leddriveskeyboard") == 0) ||
+             (uStrCaseCmp(field, "indicatordriveskbd") == 0) ||
+             (uStrCaseCmp(field, "indicatordriveskeyboard") == 0))
+    {
+        if (arrayNdx != NULL)
+            return ReportIndicatorNotArray(xkb->dpy, led, field);
+        if (!ExprResolveBoolean(value, &rtrn, NULL, NULL))
+            return ReportIndicatorBadType(xkb->dpy, led, field, "boolean");
+        if (rtrn.uval)
+            led->flags |= XkbIM_LEDDrivesKB;
+        else
+            led->flags &= ~XkbIM_LEDDrivesKB;
+        led->defs.defined |= _LED_DrivesKbd;
+    }
+    else if (uStrCaseCmp(field, "index") == 0)
+    {
+        if (arrayNdx != NULL)
+            return ReportIndicatorNotArray(xkb->dpy, led, field);
+        if (!ExprResolveInteger(value, &rtrn, NULL, NULL))
+            return ReportIndicatorBadType(xkb->dpy, led, field,
+                                          "indicator index");
+        if ((rtrn.uval < 1) || (rtrn.uval > 32))
+        {
+            ERROR2("Illegal indicator index %d (range 1..%d)\n",
+                   rtrn.uval, XkbNumIndicators);
+            ACTION1("Index definition for %s indicator ignored\n",
+                    XkbAtomText(NULL, led->name, XkbMessage));
+            return False;
+        }
+        led->indicator = rtrn.uval;
+        led->defs.defined |= _LED_Index;
+    }
+    else
+    {
+        ERROR2("Unknown field %s in map for %s indicator\n", field,
+               XkbAtomText(NULL, led->name, XkbMessage));
+        ACTION("Definition ignored\n");
+        ok = False;
+    }
+    return ok;
+}
+
+LEDInfo *
+HandleIndicatorMapDef(IndicatorMapDef * def,
+                      XkbDescPtr xkb,
+                      LEDInfo * dflt, LEDInfo * oldLEDs, unsigned merge)
+{
+    LEDInfo led, *rtrn;
+    VarDef *var;
+    Bool ok;
+
+    if (def->merge != MergeDefault)
+        merge = def->merge;
+
+    led = *dflt;
+    led.defs.merge = merge;
+    led.name = def->name;
+
+    ok = True;
+    for (var = def->body; var != NULL; var = (VarDef *) var->common.next)
+    {
+        ExprResult elem, field;
+        ExprDef *arrayNdx;
+        if (!ExprResolveLhs(var->name, &elem, &field, &arrayNdx))
+        {
+            ok = False;
+            continue;
+        }
+        if (elem.str != NULL)
+        {
+            ERROR1
+                ("Cannot set defaults for \"%s\" element in indicator map\n",
+                 elem.str);
+            ACTION2("Assignment to %s.%s ignored\n", elem.str, field.str);
+            ok = False;
+        }
+        else
+        {
+            ok = SetIndicatorMapField(&led, xkb, field.str, arrayNdx,
+                                      var->value) && ok;
+        }
+    }
+    if (ok)
+    {
+        rtrn = AddIndicatorMap(oldLEDs, &led);
+        return rtrn;
+    }
+    return NULL;
+}
+
+Bool
+CopyIndicatorMapDefs(XkbFileInfo * result, LEDInfo * leds,
+                     LEDInfo ** unboundRtrn)
+{
+    LEDInfo *led, *next;
+    LEDInfo *unbound, *last;
+    XkbDescPtr xkb;
+
+    xkb = result->xkb;
+    if (XkbAllocNames(xkb, XkbIndicatorNamesMask, 0, 0) != Success)
+    {
+        WSGO("Couldn't allocate names\n");
+        ACTION("Indicator names may be incorrect\n");
+    }
+    if (XkbAllocIndicatorMaps(xkb) != Success)
+    {
+        WSGO("Can't allocate indicator maps\n");
+        ACTION("Indicator map definitions may be lost\n");
+        return False;
+    }
+    last = unbound = (unboundRtrn ? *unboundRtrn : NULL);
+    while ((last != NULL) && (last->defs.next != NULL))
+    {
+        last = (LEDInfo *) last->defs.next;
+    }
+    for (led = leds; led != NULL; led = next)
+    {
+        next = (LEDInfo *) led->defs.next;
+        if ((led->groups != 0) && (led->which_groups == 0))
+            led->which_groups = XkbIM_UseEffective;
+        if ((led->which_mods == 0) && ((led->real_mods) || (led->vmods)))
+            led->which_mods = XkbIM_UseEffective;
+        if ((led->indicator == _LED_NotBound) || (!xkb->indicators))
+        {
+            if (unboundRtrn != NULL)
+            {
+                led->defs.next = NULL;
+                if (last != NULL)
+                    last->defs.next = (CommonInfo *) led;
+                else
+                    unbound = led;
+                last = led;
+            }
+            else
+                uFree(led);
+        }
+        else
+        {
+            register XkbIndicatorMapPtr im;
+            im = &xkb->indicators->maps[led->indicator - 1];
+            im->flags = led->flags;
+            im->which_groups = led->which_groups;
+            im->groups = led->groups;
+            im->which_mods = led->which_mods;
+            im->mods.mask = led->real_mods;
+            im->mods.real_mods = led->real_mods;
+            im->mods.vmods = led->vmods;
+            im->ctrls = led->ctrls;
+            if (xkb->names != NULL)
+                xkb->names->indicators[led->indicator - 1] = led->name;
+            uFree(led);
+        }
+    }
+    if (unboundRtrn != NULL)
+    {
+        *unboundRtrn = unbound;
+    }
+    return True;
+}
+
+Bool
+BindIndicators(XkbFileInfo * result,
+               Bool force, LEDInfo * unbound, LEDInfo ** unboundRtrn)
+{
+    XkbDescPtr xkb;
+    register int i;
+    register LEDInfo *led, *next, *last;
+
+    xkb = result->xkb;
+    if (xkb->names != NULL)
+    {
+        for (led = unbound; led != NULL; led = (LEDInfo *) led->defs.next)
+        {
+            if (led->indicator == _LED_NotBound)
+            {
+                for (i = 0; i < XkbNumIndicators; i++)
+                {
+                    if (xkb->names->indicators[i] == led->name)
+                    {
+                        led->indicator = i + 1;
+                        break;
+                    }
+                }
+            }
+        }
+        if (force)
+        {
+            for (led = unbound; led != NULL; led = (LEDInfo *) led->defs.next)
+            {
+                if (led->indicator == _LED_NotBound)
+                {
+                    for (i = 0; i < XkbNumIndicators; i++)
+                    {
+                        if (xkb->names->indicators[i] == None)
+                        {
+                            xkb->names->indicators[i] = led->name;
+                            led->indicator = i + 1;
+                            xkb->indicators->phys_indicators &= ~(1 << i);
+                            break;
+                        }
+                    }
+                    if (led->indicator == _LED_NotBound)
+                    {
+                        ERROR("No unnamed indicators found\n");
+                        ACTION1
+                            ("Virtual indicator map \"%s\" not bound\n",
+                             XkbAtomGetString(xkb->dpy, led->name));
+                        continue;
+                    }
+                }
+            }
+        }
+    }
+    for (last = NULL, led = unbound; led != NULL; led = next)
+    {
+        next = (LEDInfo *) led->defs.next;
+        if (led->indicator == _LED_NotBound)
+        {
+            if (force)
+            {
+                unbound = next;
+                uFree(led);
+            }
+            else
+            {
+                if (last)
+                    last->defs.next = &led->defs;
+                else
+                    unbound = led;
+                last = led;
+            }
+        }
+        else
+        {
+            if ((xkb->names != NULL) &&
+                (xkb->names->indicators[led->indicator - 1] != led->name))
+            {
+                Atom old = xkb->names->indicators[led->indicator - 1];
+                ERROR1("Multiple names bound to indicator %d\n",
+                       (unsigned int) led->indicator);
+                ACTION2("Using %s, ignoring %s\n",
+                        XkbAtomGetString(xkb->dpy, old),
+                        XkbAtomGetString(xkb->dpy, led->name));
+                led->indicator = _LED_NotBound;
+                if (force)
+                {
+                    uFree(led);
+                    unbound = next;
+                }
+                else
+                {
+                    if (last)
+                        last->defs.next = &led->defs;
+                    else
+                        unbound = led;
+                    last = led;
+                }
+            }
+            else
+            {
+                XkbIndicatorMapPtr map;
+                map = &xkb->indicators->maps[led->indicator - 1];
+                map->flags = led->flags;
+                map->which_groups = led->which_groups;
+                map->groups = led->groups;
+                map->which_mods = led->which_mods;
+                map->mods.mask = led->real_mods;
+                map->mods.real_mods = led->real_mods;
+                map->mods.vmods = led->vmods;
+                map->ctrls = led->ctrls;
+                if (last)
+                    last->defs.next = &next->defs;
+                else
+                    unbound = next;
+                led->defs.next = NULL;
+                uFree(led);
+            }
+        }
+    }
+    if (unboundRtrn)
+    {
+        *unboundRtrn = unbound;
+    }
+    else if (unbound)
+    {
+        for (led = unbound; led != NULL; led = next)
+        {
+            next = (LEDInfo *) led->defs.next;
+            uFree(led);
+        }
+    }
+    return True;
+}
diff --git a/indicators.h b/indicators.h
new file mode 100644 (file)
index 0000000..35ae38a
--- /dev/null
@@ -0,0 +1,88 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 INDICATORS_H
+#define INDICATORS_H 1
+
+#define        _LED_Index      (1<<0)
+#define        _LED_Mods       (1<<1)
+#define        _LED_Groups     (1<<2)
+#define        _LED_Ctrls      (1<<3)
+#define        _LED_Explicit   (1<<4)
+#define        _LED_Automatic  (1<<5)
+#define        _LED_DrivesKbd  (1<<6)
+
+#define        _LED_NotBound   255
+
+typedef struct _LEDInfo
+{
+    CommonInfo defs;
+    Atom name;
+    unsigned char indicator;
+    unsigned char flags;
+    unsigned char which_mods;
+    unsigned char real_mods;
+    unsigned short vmods;
+    unsigned char which_groups;
+    unsigned char groups;
+    unsigned int ctrls;
+} LEDInfo;
+
+extern void ClearIndicatorMapInfo(Display * /* dpy */ ,
+                                  LEDInfo *     /* info */
+    );
+
+
+extern LEDInfo *AddIndicatorMap(LEDInfo * /* oldLEDs */ ,
+                                LEDInfo *       /* newLED */
+    );
+
+extern int SetIndicatorMapField(LEDInfo * /* led */ ,
+                                XkbDescPtr /* xkb */ ,
+                                char * /* field */ ,
+                                ExprDef * /* arrayNdx */ ,
+                                ExprDef *       /* value */
+    );
+
+extern LEDInfo *HandleIndicatorMapDef(IndicatorMapDef * /* stmt */ ,
+                                      XkbDescPtr /* xkb */ ,
+                                      LEDInfo * /* dflt */ ,
+                                      LEDInfo * /* oldLEDs */ ,
+                                      unsigned  /* mergeMode */
+    );
+
+extern Bool CopyIndicatorMapDefs(XkbFileInfo * /* result */ ,
+                                 LEDInfo * /* leds */ ,
+                                 LEDInfo **     /* unboundRtrn */
+    );
+
+extern Bool BindIndicators(XkbFileInfo * /* result */ ,
+                           Bool /* force */ ,
+                           LEDInfo * /* unbound */ ,
+                           LEDInfo **   /* unboundRtrn */
+    );
+
+#endif /* INDICATORS_H */
diff --git a/install-sh b/install-sh
new file mode 100755 (executable)
index 0000000..6781b98
--- /dev/null
@@ -0,0 +1,520 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2009-04-28.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""       $nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+       shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+       case $mode in
+         *' '* | *'    '* | *'
+'*       | *'*'* | *'?'* | *'['*)
+           echo "$0: invalid mode: $mode" >&2
+           exit 1;;
+       esac
+       shift;;
+
+    -o) chowncmd="$chownprog $2"
+       shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+       shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)        shift
+       break;;
+
+    -*)        echo "$0: invalid option: $1" >&2
+       exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  trap '(exit $?); exit' 1 2 13 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+       u_plus_rw=
+      else
+       u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+       u_plus_rw=
+      else
+       u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dst_arg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+       echo "$0: $dst_arg: Is a directory" >&2
+       exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+       (dirname "$dst") 2>/dev/null ||
+       expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+            X"$dst" : 'X\(//\)[^/]' \| \
+            X"$dst" : 'X\(//\)$' \| \
+            X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+       echo X"$dst" |
+           sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\/\)[^/].*/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\/\)$/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\).*/{
+                  s//\1/
+                  q
+                }
+                s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+       # Create intermediate dirs using mode 755 as modified by the umask.
+       # This is like FreeBSD 'install' as of 1997-10-28.
+       umask=`umask`
+       case $stripcmd.$umask in
+         # Optimize common cases.
+         *[2367][2367]) mkdir_umask=$umask;;
+         .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+         *[0-7])
+           mkdir_umask=`expr $umask + 22 \
+             - $umask % 100 % 40 + $umask % 20 \
+             - $umask % 10 % 4 + $umask % 2
+           `;;
+         *) mkdir_umask=$umask,go-w;;
+       esac
+
+       # With -d, create the new directory with the user-specified mode.
+       # Otherwise, rely on $mkdir_umask.
+       if test -n "$dir_arg"; then
+         mkdir_mode=-m$mode
+       else
+         mkdir_mode=
+       fi
+
+       posix_mkdir=false
+       case $umask in
+         *[123567][0-7][0-7])
+           # POSIX mkdir -p sets u+wx bits regardless of umask, which
+           # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+           ;;
+         *)
+           tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+           trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+           if (umask $mkdir_umask &&
+               exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+           then
+             if test -z "$dir_arg" || {
+                  # Check for POSIX incompatibilities with -m.
+                  # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                  # other-writeable bit of parent directory when it shouldn't.
+                  # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                  ls_ld_tmpdir=`ls -ld "$tmpdir"`
+                  case $ls_ld_tmpdir in
+                    d????-?r-*) different_mode=700;;
+                    d????-?--*) different_mode=755;;
+                    *) false;;
+                  esac &&
+                  $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+                    ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+                    test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                  }
+                }
+             then posix_mkdir=:
+             fi
+             rmdir "$tmpdir/d" "$tmpdir"
+           else
+             # Remove any dirs left behind by ancient mkdir implementations.
+             rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+           fi
+           trap '' 0;;
+       esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+       umask $mkdir_umask &&
+       $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+       /*) prefix='/';;
+       -*) prefix='./';;
+       *)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+       test -z "$d" && continue
+
+       prefix=$prefix$d
+       if test -d "$prefix"; then
+         prefixes=
+       else
+         if $posix_mkdir; then
+           (umask=$mkdir_umask &&
+            $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+           # Don't fail if two instances are running concurrently.
+           test -d "$prefix" || exit 1
+         else
+           case $prefix in
+             *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+             *) qprefix=$prefix;;
+           esac
+           prefixes="$prefixes '$qprefix'"
+         fi
+       fi
+       prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+       # Don't fail if two instances are running concurrently.
+       (umask $mkdir_umask &&
+        eval "\$doit_exec \$mkdirprog $prefixes") ||
+         test -d "$dstdir" || exit 1
+       obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"    2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+       # Now remove or move aside any old file at destination location.
+       # We try this two ways since rm can't unlink itself on some
+       # systems and the destination file might be busy for other
+       # reasons.  In this case, the final cleanup might fail but the new
+       # file should still install successfully.
+       {
+         test ! -f "$dst" ||
+         $doit $rmcmd -f "$dst" 2>/dev/null ||
+         { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+           { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+         } ||
+         { echo "$0: cannot unlink or rename $dst" >&2
+           (exit 1); exit 1
+         }
+       } &&
+
+       # Now rename the file to the real destination.
+       $doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/keycodes.c b/keycodes.c
new file mode 100644 (file)
index 0000000..13579ec
--- /dev/null
@@ -0,0 +1,894 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 "xkbcomp.h"
+#include "tokens.h"
+#include "expr.h"
+#include "keycodes.h"
+#include "misc.h"
+#include "alias.h"
+
+char *
+longText(unsigned long val, unsigned format)
+{
+    char buf[4];
+
+    LongToKeyName(val, buf);
+    return XkbKeyNameText(buf, format);
+}
+
+/***====================================================================***/
+
+void
+LongToKeyName(unsigned long val, char *name)
+{
+    name[0] = ((val >> 24) & 0xff);
+    name[1] = ((val >> 16) & 0xff);
+    name[2] = ((val >> 8) & 0xff);
+    name[3] = (val & 0xff);
+    return;
+}
+
+/***====================================================================***/
+
+typedef struct _IndicatorNameInfo
+{
+    CommonInfo defs;
+    int ndx;
+    Atom name;
+    Bool virtual;
+} IndicatorNameInfo;
+
+typedef struct _KeyNamesInfo
+{
+    char *name;     /* e.g. evdev+aliases(qwerty) */
+    int errorCount;
+    unsigned fileID;
+    unsigned merge;
+    int computedMin; /* lowest keycode stored */
+    int computedMax; /* highest keycode stored */
+    int explicitMin;
+    int explicitMax;
+    int effectiveMin;
+    int effectiveMax;
+    unsigned long names[XkbMaxLegalKeyCode + 1]; /* 4-letter name of key, keycode is the index */
+    unsigned files[XkbMaxLegalKeyCode + 1];
+    unsigned char has_alt_forms[XkbMaxLegalKeyCode + 1];
+    IndicatorNameInfo *leds;
+    AliasInfo *aliases;
+} KeyNamesInfo;
+
+static void HandleKeycodesFile(XkbFile * file,
+                               XkbDescPtr xkb,
+                               unsigned merge,
+                               KeyNamesInfo * info);
+
+static void
+InitIndicatorNameInfo(IndicatorNameInfo * ii, KeyNamesInfo * info)
+{
+    ii->defs.defined = 0;
+    ii->defs.merge = info->merge;
+    ii->defs.fileID = info->fileID;
+    ii->defs.next = NULL;
+    ii->ndx = 0;
+    ii->name = None;
+    ii->virtual = False;
+    return;
+}
+
+static void
+ClearIndicatorNameInfo(IndicatorNameInfo * ii, KeyNamesInfo * info)
+{
+    if (ii == info->leds)
+    {
+        ClearCommonInfo(&ii->defs);
+        info->leds = NULL;
+    }
+    return;
+}
+
+static IndicatorNameInfo *
+NextIndicatorName(KeyNamesInfo * info)
+{
+    IndicatorNameInfo *ii;
+
+    ii = uTypedAlloc(IndicatorNameInfo);
+    if (ii)
+    {
+        InitIndicatorNameInfo(ii, info);
+        info->leds = (IndicatorNameInfo *) AddCommonInfo(&info->leds->defs,
+                                                         (CommonInfo *) ii);
+    }
+    return ii;
+}
+
+static IndicatorNameInfo *
+FindIndicatorByIndex(KeyNamesInfo * info, int ndx)
+{
+    IndicatorNameInfo *old;
+
+    for (old = info->leds; old != NULL;
+         old = (IndicatorNameInfo *) old->defs.next)
+    {
+        if (old->ndx == ndx)
+            return old;
+    }
+    return NULL;
+}
+
+static IndicatorNameInfo *
+FindIndicatorByName(KeyNamesInfo * info, Atom name)
+{
+    IndicatorNameInfo *old;
+
+    for (old = info->leds; old != NULL;
+         old = (IndicatorNameInfo *) old->defs.next)
+    {
+        if (old->name == name)
+            return old;
+    }
+    return NULL;
+}
+
+static Bool
+AddIndicatorName(KeyNamesInfo * info, IndicatorNameInfo * new)
+{
+    IndicatorNameInfo *old;
+    Bool replace;
+
+    replace = (new->defs.merge == MergeReplace) ||
+        (new->defs.merge == MergeOverride);
+    old = FindIndicatorByName(info, new->name);
+    if (old)
+    {
+        if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0))
+            || (warningLevel > 9))
+        {
+            WARN1("Multiple indicators named %s\n",
+                  XkbAtomText(NULL, new->name, XkbMessage));
+            if (old->ndx == new->ndx)
+            {
+                if (old->virtual != new->virtual)
+                {
+                    if (replace)
+                        old->virtual = new->virtual;
+                    ACTION2("Using %s instead of %s\n",
+                            (old->virtual ? "virtual" : "real"),
+                            (old->virtual ? "real" : "virtual"));
+                }
+                else
+                {
+                    ACTION("Identical definitions ignored\n");
+                }
+                return True;
+            }
+            else
+            {
+                if (replace)
+                    ACTION2("Ignoring %d, using %d\n", old->ndx, new->ndx);
+                else
+                    ACTION2("Using %d, ignoring %d\n", old->ndx, new->ndx);
+            }
+            if (replace)
+            {
+                if (info->leds == old)
+                    info->leds = (IndicatorNameInfo *) old->defs.next;
+                else
+                {
+                    IndicatorNameInfo *tmp;
+                    tmp = info->leds;
+                    for (; tmp != NULL;
+                         tmp = (IndicatorNameInfo *) tmp->defs.next)
+                    {
+                        if (tmp->defs.next == (CommonInfo *) old)
+                        {
+                            tmp->defs.next = old->defs.next;
+                            break;
+                        }
+                    }
+                }
+                uFree(old);
+            }
+        }
+    }
+    old = FindIndicatorByIndex(info, new->ndx);
+    if (old)
+    {
+        if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0))
+            || (warningLevel > 9))
+        {
+            WARN1("Multiple names for indicator %d\n", new->ndx);
+            if ((old->name == new->name) && (old->virtual == new->virtual))
+                ACTION("Identical definitions ignored\n");
+            else
+            {
+                const char *oldType, *newType;
+                Atom using, ignoring;
+                if (old->virtual)
+                    oldType = "virtual indicator";
+                else
+                    oldType = "real indicator";
+                if (new->virtual)
+                    newType = "virtual indicator";
+                else
+                    newType = "real indicator";
+                if (replace)
+                {
+                    using = new->name;
+                    ignoring = old->name;
+                }
+                else
+                {
+                    using = old->name;
+                    ignoring = new->name;
+                }
+                ACTION4("Using %s %s, ignoring %s %s\n",
+                        oldType, XkbAtomText(NULL, using, XkbMessage),
+                        newType, XkbAtomText(NULL, ignoring, XkbMessage));
+            }
+        }
+        if (replace)
+        {
+            old->name = new->name;
+            old->virtual = new->virtual;
+        }
+        return True;
+    }
+    old = new;
+    new = NextIndicatorName(info);
+    if (!new)
+    {
+        WSGO1("Couldn't allocate name for indicator %d\n", new->ndx);
+        ACTION("Ignored\n");
+        return False;
+    }
+    new->name = old->name;
+    new->ndx = old->ndx;
+    new->virtual = old->virtual;
+    return True;
+}
+
+static void
+ClearKeyNamesInfo(KeyNamesInfo * info)
+{
+    if (info->name != NULL)
+        uFree(info->name);
+    info->name = NULL;
+    info->computedMax = info->explicitMax = info->explicitMin = -1;
+    info->computedMin = 256;
+    info->effectiveMin = 8;
+    info->effectiveMax = 255;
+    bzero((char *) info->names, sizeof(info->names));
+    bzero((char *) info->files, sizeof(info->files));
+    bzero((char *) info->has_alt_forms, sizeof(info->has_alt_forms));
+    if (info->leds)
+        ClearIndicatorNameInfo(info->leds, info);
+    if (info->aliases)
+        ClearAliases(&info->aliases);
+    return;
+}
+
+static void
+InitKeyNamesInfo(KeyNamesInfo * info)
+{
+    info->name = NULL;
+    info->leds = NULL;
+    info->aliases = NULL;
+    ClearKeyNamesInfo(info);
+    info->errorCount = 0;
+    return;
+}
+
+static int
+FindKeyByLong(KeyNamesInfo * info, unsigned long name)
+{
+    register int i;
+
+    for (i = info->effectiveMin; i <= info->effectiveMax; i++)
+    {
+        if (info->names[i] == name)
+            return i;
+    }
+    return 0;
+}
+
+/**
+ * Store the name of the key as a long in the info struct under the given
+ * keycode. If the same keys is referred to twice, print a warning.
+ * Note that the key's name is stored as a long, the keycode is the index.
+ */
+static Bool
+AddKeyName(KeyNamesInfo * info,
+           int kc,
+           char *name, unsigned merge, unsigned fileID, Bool reportCollisions)
+{
+    int old;
+    unsigned long lval;
+
+    if ((kc < info->effectiveMin) || (kc > info->effectiveMax))
+    {
+        ERROR2("Illegal keycode %d for name <%s>\n", kc, name);
+        ACTION2("Must be in the range %d-%d inclusive\n",
+                info->effectiveMin, info->effectiveMax);
+        return False;
+    }
+    if (kc < info->computedMin)
+        info->computedMin = kc;
+    if (kc > info->computedMax)
+        info->computedMax = kc;
+    lval = KeyNameToLong(name);
+
+    if (reportCollisions)
+    {
+        reportCollisions = ((warningLevel > 7) ||
+                            ((warningLevel > 0)
+                             && (fileID == info->files[kc])));
+    }
+
+    if (info->names[kc] != 0)
+    {
+        char buf[6];
+
+        LongToKeyName(info->names[kc], buf);
+        buf[4] = '\0';
+        if (info->names[kc] == lval)
+        {
+            if (info->has_alt_forms[kc] || (merge == MergeAltForm))
+            {
+                info->has_alt_forms[kc] = True;
+            }
+            else if (reportCollisions)
+            {
+                WARN("Multiple identical key name definitions\n");
+                ACTION2("Later occurences of \"<%s> = %d\" ignored\n",
+                        buf, kc);
+            }
+            return True;
+        }
+        if (merge == MergeAugment)
+        {
+            if (reportCollisions)
+            {
+                WARN1("Multiple names for keycode %d\n", kc);
+                ACTION2("Using <%s>, ignoring <%s>\n", buf, name);
+            }
+            return True;
+        }
+        else
+        {
+            if (reportCollisions)
+            {
+                WARN1("Multiple names for keycode %d\n", kc);
+                ACTION2("Using <%s>, ignoring <%s>\n", name, buf);
+            }
+            info->names[kc] = 0;
+            info->files[kc] = 0;
+        }
+    }
+    old = FindKeyByLong(info, lval);
+    if ((old != 0) && (old != kc))
+    {
+        if (merge == MergeOverride)
+        {
+            info->names[old] = 0;
+            info->files[old] = 0;
+            info->has_alt_forms[old] = True;
+            if (reportCollisions)
+            {
+                WARN1("Key name <%s> assigned to multiple keys\n", name);
+                ACTION2("Using %d, ignoring %d\n", kc, old);
+            }
+        }
+        else if (merge != MergeAltForm)
+        {
+            if ((reportCollisions) && (warningLevel > 3))
+            {
+                WARN1("Key name <%s> assigned to multiple keys\n", name);
+                ACTION2("Using %d, ignoring %d\n", old, kc);
+                ACTION
+                    ("Use 'alternate' keyword to assign the same name to multiple keys\n");
+            }
+            return True;
+        }
+        else
+        {
+            info->has_alt_forms[old] = True;
+        }
+    }
+    info->names[kc] = lval;
+    info->files[kc] = fileID;
+    info->has_alt_forms[kc] = (merge == MergeAltForm);
+    return True;
+}
+
+/***====================================================================***/
+
+static void
+MergeIncludedKeycodes(KeyNamesInfo * into, KeyNamesInfo * from,
+                      unsigned merge)
+{
+    register int i;
+    char buf[5];
+
+    if (from->errorCount > 0)
+    {
+        into->errorCount += from->errorCount;
+        return;
+    }
+    if (into->name == NULL)
+    {
+        into->name = from->name;
+        from->name = NULL;
+    }
+    for (i = from->computedMin; i <= from->computedMax; i++)
+    {
+        unsigned thisMerge;
+        if (from->names[i] == 0)
+            continue;
+        LongToKeyName(from->names[i], buf);
+        buf[4] = '\0';
+        if (from->has_alt_forms[i])
+            thisMerge = MergeAltForm;
+        else
+            thisMerge = merge;
+        if (!AddKeyName(into, i, buf, thisMerge, from->fileID, False))
+            into->errorCount++;
+    }
+    if (from->leds)
+    {
+        IndicatorNameInfo *led, *next;
+        for (led = from->leds; led != NULL; led = next)
+        {
+            if (merge != MergeDefault)
+                led->defs.merge = merge;
+            if (!AddIndicatorName(into, led))
+                into->errorCount++;
+            next = (IndicatorNameInfo *) led->defs.next;
+        }
+    }
+    if (!MergeAliases(&into->aliases, &from->aliases, merge))
+        into->errorCount++;
+    if (from->explicitMin > 0)
+    {
+        if ((into->explicitMin < 0)
+            || (into->explicitMin > from->explicitMin))
+            into->effectiveMin = into->explicitMin = from->explicitMin;
+    }
+    if (from->explicitMax > 0)
+    {
+        if ((into->explicitMax < 0)
+            || (into->explicitMax < from->explicitMax))
+            into->effectiveMax = into->explicitMax = from->explicitMax;
+    }
+    return;
+}
+
+/**
+ * Handle the given include statement (e.g. "include "evdev+aliases(qwerty)").
+ *
+ * @param stmt The include statement from the keymap file.
+ * @param xkb Unused for all but the xkb->flags.
+ * @param info Struct to store the key info in.
+ */
+static Bool
+HandleIncludeKeycodes(IncludeStmt * stmt, XkbDescPtr xkb, KeyNamesInfo * info)
+{
+    unsigned newMerge;
+    XkbFile *rtrn;
+    KeyNamesInfo included = {NULL};
+    Bool haveSelf;
+
+    haveSelf = False;
+    if ((stmt->file == NULL) && (stmt->map == NULL))
+    {
+        haveSelf = True;
+        included = *info;
+        bzero(info, sizeof(KeyNamesInfo));
+    }
+    else if (strcmp(stmt->file, "computed") == 0)
+    {
+        xkb->flags |= AutoKeyNames;
+        info->explicitMin = XkbMinLegalKeyCode;
+        info->explicitMax = XkbMaxLegalKeyCode;
+        return (info->errorCount == 0);
+    } /* parse file, store returned info in the xkb struct */
+    else if (ProcessIncludeFile(stmt, XkmKeyNamesIndex, &rtrn, &newMerge))
+    {
+        InitKeyNamesInfo(&included);
+        HandleKeycodesFile(rtrn, xkb, MergeOverride, &included);
+        if (stmt->stmt != NULL)
+        {
+            if (included.name != NULL)
+                uFree(included.name);
+            included.name = stmt->stmt;
+            stmt->stmt = NULL;
+        }
+    }
+    else
+    {
+        info->errorCount += 10; /* XXX: why 10?? */
+        return False;
+    }
+    /* Do we have more than one include statement? */
+    if ((stmt->next != NULL) && (included.errorCount < 1))
+    {
+        IncludeStmt *next;
+        unsigned op;
+        KeyNamesInfo next_incl;
+
+        for (next = stmt->next; next != NULL; next = next->next)
+        {
+            if ((next->file == NULL) && (next->map == NULL))
+            {
+                haveSelf = True;
+                MergeIncludedKeycodes(&included, info, next->merge);
+                ClearKeyNamesInfo(info);
+            }
+            else if (ProcessIncludeFile(next, XkmKeyNamesIndex, &rtrn, &op))
+            {
+                InitKeyNamesInfo(&next_incl);
+                HandleKeycodesFile(rtrn, xkb, MergeOverride, &next_incl);
+                MergeIncludedKeycodes(&included, &next_incl, op);
+                ClearKeyNamesInfo(&next_incl);
+            }
+            else
+            {
+                info->errorCount += 10; /* XXX: Why 10?? */
+                return False;
+            }
+        }
+    }
+    if (haveSelf)
+        *info = included;
+    else
+    {
+        MergeIncludedKeycodes(info, &included, newMerge);
+        ClearKeyNamesInfo(&included);
+    }
+    return (info->errorCount == 0);
+}
+
+/**
+ * Parse the given statement and store the output in the info struct.
+ * e.g. <ESC> = 9
+ */
+static int
+HandleKeycodeDef(KeycodeDef * stmt, unsigned merge, KeyNamesInfo * info)
+{
+    int code;
+    ExprResult result;
+
+    if (!ExprResolveInteger(stmt->value, &result, NULL, NULL))
+    {
+        ACTION1("No value keycode assigned to name <%s>\n", stmt->name);
+        return 0;
+    }
+    code = result.ival;
+    if ((code < info->effectiveMin) || (code > info->effectiveMax))
+    {
+        ERROR2("Illegal keycode %d for name <%s>\n", code, stmt->name);
+        ACTION2("Must be in the range %d-%d inclusive\n",
+                info->effectiveMin, info->effectiveMax);
+        return 0;
+    }
+    if (stmt->merge != MergeDefault)
+    {
+        if (stmt->merge == MergeReplace)
+            merge = MergeOverride;
+        else
+            merge = stmt->merge;
+    }
+    return AddKeyName(info, code, stmt->name, merge, info->fileID, True);
+}
+
+#define        MIN_KEYCODE_DEF         0
+#define        MAX_KEYCODE_DEF         1
+
+/**
+ * Handle the minimum/maximum statement of the xkb file.
+ * Sets explicitMin/Max and effectiveMin/Max of the info struct.
+ *
+ * @return 1 on success, 0 otherwise.
+ */
+static int
+HandleKeyNameVar(VarDef * stmt, KeyNamesInfo * info)
+{
+    ExprResult tmp, field;
+    ExprDef *arrayNdx;
+    int which;
+
+    if (ExprResolveLhs(stmt->name, &tmp, &field, &arrayNdx) == 0)
+        return 0;               /* internal error, already reported */
+
+    if (tmp.str != NULL)
+    {
+        ERROR1("Unknown element %s encountered\n", tmp.str);
+        ACTION1("Default for field %s ignored\n", field.str);
+        return 0;
+    }
+    if (uStrCaseCmp(field.str, "minimum") == 0)
+        which = MIN_KEYCODE_DEF;
+    else if (uStrCaseCmp(field.str, "maximum") == 0)
+        which = MAX_KEYCODE_DEF;
+    else
+    {
+        ERROR("Unknown field encountered\n");
+        ACTION1("Assigment to field %s ignored\n", field.str);
+        return 0;
+    }
+    if (arrayNdx != NULL)
+    {
+        ERROR1("The %s setting is not an array\n", field.str);
+        ACTION("Illegal array reference ignored\n");
+        return 0;
+    }
+
+    if (ExprResolveInteger(stmt->value, &tmp, NULL, NULL) == 0)
+    {
+        ACTION1("Assignment to field %s ignored\n", field.str);
+        return 0;
+    }
+    if ((tmp.ival < XkbMinLegalKeyCode) || (tmp.ival > XkbMaxLegalKeyCode))
+    {
+        ERROR3
+            ("Illegal keycode %d (must be in the range %d-%d inclusive)\n",
+             tmp.ival, XkbMinLegalKeyCode, XkbMaxLegalKeyCode);
+        ACTION1("Value of \"%s\" not changed\n", field.str);
+        return 0;
+    }
+    if (which == MIN_KEYCODE_DEF)
+    {
+        if ((info->explicitMax > 0) && (info->explicitMax < tmp.ival))
+        {
+            ERROR2
+                ("Minimum key code (%d) must be <= maximum key code (%d)\n",
+                 tmp.ival, info->explicitMax);
+            ACTION("Minimum key code value not changed\n");
+            return 0;
+        }
+        if ((info->computedMax > 0) && (info->computedMin < tmp.ival))
+        {
+            ERROR2
+                ("Minimum key code (%d) must be <= lowest defined key (%d)\n",
+                 tmp.ival, info->computedMin);
+            ACTION("Minimum key code value not changed\n");
+            return 0;
+        }
+        info->explicitMin = tmp.ival;
+        info->effectiveMin = tmp.ival;
+    }
+    if (which == MAX_KEYCODE_DEF)
+    {
+        if ((info->explicitMin > 0) && (info->explicitMin > tmp.ival))
+        {
+            ERROR2("Maximum code (%d) must be >= minimum key code (%d)\n",
+                   tmp.ival, info->explicitMin);
+            ACTION("Maximum code value not changed\n");
+            return 0;
+        }
+        if ((info->computedMax > 0) && (info->computedMax > tmp.ival))
+        {
+            ERROR2
+                ("Maximum code (%d) must be >= highest defined key (%d)\n",
+                 tmp.ival, info->computedMax);
+            ACTION("Maximum code value not changed\n");
+            return 0;
+        }
+        info->explicitMax = tmp.ival;
+        info->effectiveMax = tmp.ival;
+    }
+    return 1;
+}
+
+static int
+HandleIndicatorNameDef(IndicatorNameDef * def,
+                       unsigned merge, KeyNamesInfo * info)
+{
+    IndicatorNameInfo ii;
+    ExprResult tmp;
+
+    if ((def->ndx < 1) || (def->ndx > XkbNumIndicators))
+    {
+        info->errorCount++;
+        ERROR1("Name specified for illegal indicator index %d\n", def->ndx);
+        ACTION("Ignored\n");
+        return False;
+    }
+    InitIndicatorNameInfo(&ii, info);
+    ii.ndx = def->ndx;
+    if (!ExprResolveString(def->name, &tmp, NULL, NULL))
+    {
+        char buf[20];
+        snprintf(buf, sizeof(buf), "%d", def->ndx);
+        info->errorCount++;
+        return ReportBadType("indicator", "name", buf, "string");
+    }
+    ii.name = XkbInternAtom(NULL, tmp.str, False);
+    ii.virtual = def->virtual;
+    if (!AddIndicatorName(info, &ii))
+        return False;
+    return True;
+}
+
+/**
+ * Handle the xkb_keycodes section of a xkb file.
+ * All information about parsed keys is stored in the info struct.
+ *
+ * Such a section may have include statements, in which case this function is
+ * semi-recursive (it calls HandleIncludeKeycodes, which may call
+ * HandleKeycodesFile again).
+ *
+ * @param file The input file (parsed xkb_keycodes section)
+ * @param xkb Necessary to pass down, may have flags changed.
+ * @param merge Merge strategy (MergeOverride, etc.)
+ * @param info Struct to contain the fully parsed key information.
+ */
+static void
+HandleKeycodesFile(XkbFile * file,
+                   XkbDescPtr xkb, unsigned merge, KeyNamesInfo * info)
+{
+    ParseCommon *stmt;
+
+    info->name = uStringDup(file->name);
+    stmt = file->defs;
+    while (stmt)
+    {
+        switch (stmt->stmtType)
+        {
+        case StmtInclude:    /* e.g. include "evdev+aliases(qwerty)" */
+            if (!HandleIncludeKeycodes((IncludeStmt *) stmt, xkb, info))
+                info->errorCount++;
+            break;
+        case StmtKeycodeDef: /* e.g. <ESC> = 9; */
+            if (!HandleKeycodeDef((KeycodeDef *) stmt, merge, info))
+                info->errorCount++;
+            break;
+        case StmtKeyAliasDef: /* e.g. alias <MENU> = <COMP>; */
+            if (!HandleAliasDef((KeyAliasDef *) stmt,
+                                merge, info->fileID, &info->aliases))
+                info->errorCount++;
+            break;
+        case StmtVarDef: /* e.g. minimum, maximum */
+            if (!HandleKeyNameVar((VarDef *) stmt, info))
+                info->errorCount++;
+            break;
+        case StmtIndicatorNameDef: /* e.g. indicator 1 = "Caps Lock"; */
+            if (!HandleIndicatorNameDef((IndicatorNameDef *) stmt,
+                                        merge, info))
+            {
+                info->errorCount++;
+            }
+            break;
+        case StmtInterpDef:
+        case StmtVModDef:
+            ERROR("Keycode files may define key and indicator names only\n");
+            ACTION1("Ignoring definition of %s\n",
+                    ((stmt->stmtType ==
+                      StmtInterpDef) ? "a symbol interpretation" :
+                     "virtual modifiers"));
+            info->errorCount++;
+            break;
+        default:
+            WSGO1("Unexpected statement type %d in HandleKeycodesFile\n",
+                  stmt->stmtType);
+            break;
+        }
+        stmt = stmt->next;
+        if (info->errorCount > 10)
+        {
+#ifdef NOISY
+            ERROR("Too many errors\n");
+#endif
+            ACTION1("Abandoning keycodes file \"%s\"\n", file->topName);
+            break;
+        }
+    }
+    return;
+}
+
+/**
+ * Compile the xkb_keycodes section, parse it's output, return the results.
+ *
+ * @param file The parsed XKB file (may have include statements requiring
+ * further parsing)
+ * @param result The effective keycodes, as gathered from the file.
+ * @param merge Merge strategy.
+ *
+ * @return True on success, False otherwise.
+ */
+Bool
+CompileKeycodes(XkbFile * file, XkbFileInfo * result, unsigned merge)
+{
+    KeyNamesInfo info; /* contains all the info after parsing */
+    XkbDescPtr xkb;
+
+    xkb = result->xkb;
+    InitKeyNamesInfo(&info);
+    HandleKeycodesFile(file, xkb, merge, &info);
+
+    /* all the keys are now stored in info */
+
+    if (info.errorCount == 0)
+    {
+        if (info.explicitMin > 0) /* if "minimum" statement was present */
+            xkb->min_key_code = info.effectiveMin;
+        else
+            xkb->min_key_code = info.computedMin;
+        if (info.explicitMax > 0) /* if "maximum" statement was present */
+            xkb->max_key_code = info.effectiveMax;
+        else
+            xkb->max_key_code = info.computedMax;
+        if (XkbAllocNames(xkb, XkbKeyNamesMask | XkbIndicatorNamesMask, 0, 0)
+                == Success)
+        {
+            register int i;
+            xkb->names->keycodes = XkbInternAtom(xkb->dpy, info.name, False);
+            uDEBUG2(1, "key range: %d..%d\n", xkb->min_key_code,
+                    xkb->max_key_code);
+            for (i = info.computedMin; i <= info.computedMax; i++)
+            {
+                LongToKeyName(info.names[i], xkb->names->keys[i].name);
+                uDEBUG2(2, "key %d = %s\n", i,
+                        XkbKeyNameText(xkb->names->keys[i].name, XkbMessage));
+            }
+        }
+        else
+        {
+            WSGO("Cannot create XkbNamesRec in CompileKeycodes\n");
+            return False;
+        }
+        if (info.leds)
+        {
+            IndicatorNameInfo *ii;
+            if (XkbAllocIndicatorMaps(xkb) != Success)
+            {
+                WSGO("Couldn't allocate IndicatorRec in CompileKeycodes\n");
+                ACTION("Physical indicators not set\n");
+            }
+            for (ii = info.leds; ii != NULL;
+                 ii = (IndicatorNameInfo *) ii->defs.next)
+            {
+                xkb->names->indicators[ii->ndx - 1] =
+                    XkbInternAtom(xkb->dpy,
+                                  XkbAtomGetString(NULL, ii->name), False);
+                if (xkb->indicators != NULL)
+                {
+                    register unsigned bit;
+                    bit = 1 << (ii->ndx - 1);
+                    if (ii->virtual)
+                        xkb->indicators->phys_indicators &= ~bit;
+                    else
+                        xkb->indicators->phys_indicators |= bit;
+                }
+            }
+        }
+        if (info.aliases)
+            ApplyAliases(xkb, False, &info.aliases);
+        return True;
+    }
+    ClearKeyNamesInfo(&info);
+    return False;
+}
diff --git a/keycodes.h b/keycodes.h
new file mode 100644 (file)
index 0000000..11f4460
--- /dev/null
@@ -0,0 +1,40 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 KEYCODES_H
+#define KEYCODES_H 1
+
+#define        KeyNameToLong(n)        ((((unsigned long)n[0])<<24)|(((unsigned long)n[1])<<16)|(((unsigned long)n[2])<<8)|n[3])
+
+extern char *longText(unsigned long /* val */ ,
+                      unsigned  /* format */
+    );
+
+extern void LongToKeyName(unsigned long /* val */ ,
+                          char *        /* name_rtrn */
+    );
+
+#endif /* KEYCODES_H */
diff --git a/keymap.c b/keymap.c
new file mode 100644 (file)
index 0000000..a419d8c
--- /dev/null
+++ b/keymap.c
@@ -0,0 +1,183 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 "xkbcomp.h"
+#include "tokens.h"
+#include "expr.h"
+#include "vmod.h"
+#include "action.h"
+#include "misc.h"
+#include "indicators.h"
+
+#define        KEYCODES        0
+#define        GEOMETRY        1
+#define        TYPES           2
+#define        COMPAT          3
+#define        SYMBOLS         4
+#define        MAX_SECTIONS    5
+
+static XkbFile *sections[MAX_SECTIONS];
+
+/**
+ * Compile the given file and store the output in result.
+ * @param file A list of XkbFiles, each denoting one type (e.g.
+ * XkmKeyNamesIdx, etc.)
+ */
+Bool
+CompileKeymap(XkbFile * file, XkbFileInfo * result, unsigned merge)
+{
+    unsigned have;
+    Bool ok;
+    unsigned required, legal;
+    unsigned mainType;
+    char *mainName;
+    LEDInfo *unbound = NULL;
+
+    bzero(sections, MAX_SECTIONS * sizeof(XkbFile *));
+    mainType = file->type;
+    mainName = file->name;
+    switch (mainType)
+    {
+    case XkmSemanticsFile:
+        required = XkmSemanticsRequired;
+        legal = XkmSemanticsLegal;
+        break;
+    case XkmLayoutFile:        /* standard type  if setxkbmap -print */
+        required = XkmLayoutRequired;
+        legal = XkmKeymapLegal;
+        break;
+    case XkmKeymapFile:
+        required = XkmKeymapRequired;
+        legal = XkmKeymapLegal;
+        break;
+    default:
+        ERROR1("Cannot compile %s alone into an XKM file\n",
+               XkbConfigText(mainType, XkbMessage));
+        return False;
+    }
+    have = 0;
+    ok = 1;
+    file = (XkbFile *) file->defs;
+    /* Check for duplicate entries in the input file */
+    while ((file) && (ok))
+    {
+        file->topName = mainName;
+        if ((have & (1 << file->type)) != 0)
+        {
+            ERROR2("More than one %s section in a %s file\n",
+                   XkbConfigText(file->type, XkbMessage),
+                   XkbConfigText(mainType, XkbMessage));
+            ACTION("All sections after the first ignored\n");
+            ok = False;
+        }
+        else if ((1 << file->type) & (~legal))
+        {
+            ERROR2("Cannot define %s in a %s file\n",
+                   XkbConfigText(file->type, XkbMessage),
+                   XkbConfigText(mainType, XkbMessage));
+            ok = False;
+        }
+        else
+            switch (file->type)
+            {
+            case XkmSemanticsFile:
+            case XkmLayoutFile:
+            case XkmKeymapFile:
+                WSGO2("Illegal %s configuration in a %s file\n",
+                      XkbConfigText(file->type, XkbMessage),
+                      XkbConfigText(mainType, XkbMessage));
+                ACTION("Ignored\n");
+                ok = False;
+                break;
+            case XkmKeyNamesIndex:
+                sections[KEYCODES] = file;
+                break;
+            case XkmTypesIndex:
+                sections[TYPES] = file;
+                break;
+            case XkmSymbolsIndex:
+                sections[SYMBOLS] = file;
+                break;
+            case XkmCompatMapIndex:
+                sections[COMPAT] = file;
+                break;
+            case XkmGeometryIndex:
+            case XkmGeometryFile:
+                sections[GEOMETRY] = file;
+                break;
+            case XkmVirtualModsIndex:
+            case XkmIndicatorsIndex:
+                WSGO1("Found an isolated %s section\n",
+                      XkbConfigText(file->type, XkbMessage));
+                break;
+            default:
+                WSGO1("Unknown file type %d\n", file->type);
+                break;
+            }
+        if (ok)
+            have |= (1 << file->type);
+        file = (XkbFile *) file->common.next;
+    }
+    /* compile the sections we have in the file one-by-one, or fail. */
+    if (ok)
+    {
+        if (ok && (sections[KEYCODES] != NULL))
+            ok = CompileKeycodes(sections[KEYCODES], result, MergeOverride);
+        if (ok && (sections[GEOMETRY] != NULL))
+            ok = CompileGeometry(sections[GEOMETRY], result, MergeOverride);
+        if (ok && (sections[TYPES] != NULL))
+            ok = CompileKeyTypes(sections[TYPES], result, MergeOverride);
+        if (ok && (sections[COMPAT] != NULL))
+            ok = CompileCompatMap(sections[COMPAT], result, MergeOverride,
+                                  &unbound);
+        if (ok && (sections[SYMBOLS] != NULL))
+            ok = CompileSymbols(sections[SYMBOLS], result, MergeOverride);
+    }
+    if (!ok)
+        return False;
+    result->defined = have;
+    if (required & (~have))
+    {
+        register int i, bit;
+        unsigned missing;
+        missing = required & (~have);
+        for (i = 0, bit = 1; missing != 0; i++, bit <<= 1)
+        {
+            if (missing & bit)
+            {
+                ERROR2("Missing %s section in a %s file\n",
+                       XkbConfigText(i, XkbMessage),
+                       XkbConfigText(mainType, XkbMessage));
+                missing &= ~bit;
+            }
+        }
+        ACTION1("Description of %s not compiled\n",
+                XkbConfigText(mainType, XkbMessage));
+        ok = False;
+    }
+    ok = BindIndicators(result, True, unbound, NULL);
+    return ok;
+}
diff --git a/keytypes.c b/keytypes.c
new file mode 100644 (file)
index 0000000..da55d75
--- /dev/null
@@ -0,0 +1,1293 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 "xkbcomp.h"
+#include "tokens.h"
+#include "expr.h"
+#include "vmod.h"
+#include "action.h"
+#include "misc.h"
+
+typedef struct _PreserveInfo
+{
+    CommonInfo defs;
+    short matchingMapIndex;
+    unsigned char indexMods;
+    unsigned char preMods;
+    unsigned short indexVMods;
+    unsigned short preVMods;
+} PreserveInfo;
+
+#define        _KT_Name        (1<<0)
+#define        _KT_Mask        (1<<1)
+#define        _KT_Map         (1<<2)
+#define        _KT_Preserve    (1<<3)
+#define        _KT_LevelNames  (1<<4)
+
+typedef struct _KeyTypeInfo
+{
+    CommonInfo defs;
+    Display *dpy;
+    Atom name;
+    int fileID;
+    unsigned mask;
+    unsigned vmask;
+    Bool groupInfo;
+    int numLevels;
+    int nEntries;
+    int szEntries;
+    XkbKTMapEntryPtr entries;
+    PreserveInfo *preserve;
+    int szNames;
+    Atom *lvlNames;
+} KeyTypeInfo;
+
+typedef struct _KeyTypesInfo
+{
+    Display *dpy;
+    char *name;
+    int errorCount;
+    int fileID;
+    unsigned stdPresent;
+    int nTypes;
+    KeyTypeInfo *types;
+    KeyTypeInfo dflt;
+    VModInfo vmods;
+} KeyTypesInfo;
+
+Atom tok_ONE_LEVEL;
+Atom tok_TWO_LEVEL;
+Atom tok_ALPHABETIC;
+Atom tok_KEYPAD;
+
+/***====================================================================***/
+
+#define        ReportTypeShouldBeArray(t,f) \
+       ReportShouldBeArray("key type",(f),TypeTxt(t))
+#define        ReportTypeBadType(t,f,w) \
+       ReportBadType("key type",(f),TypeTxt(t),(w))
+
+/***====================================================================***/
+
+extern Bool AddMapEntry(XkbDescPtr /* xkb */ ,
+                        KeyTypeInfo * /* type */ ,
+                        XkbKTMapEntryPtr /* new */ ,
+                        Bool /* clobber */ ,
+                        Bool    /* report */
+    );
+
+extern Bool AddPreserve(XkbDescPtr /* xkb */ ,
+                        KeyTypeInfo * /* type */ ,
+                        PreserveInfo * /* new */ ,
+                        Bool /* clobber */ ,
+                        Bool    /* report */
+    );
+
+extern Bool AddLevelName(KeyTypeInfo * /* type */ ,
+                         unsigned /* level */ ,
+                         Atom /* name */ ,
+                         Bool /* clobber */ ,
+                         Bool   /* report */
+    );
+
+#define        MapEntryTxt(t,x,e)      \
+    XkbVModMaskText((t)->dpy,(x),(e)->mods.real_mods,(e)->mods.vmods,XkbMessage)
+#define        PreserveIndexTxt(t,x,p) \
+       XkbVModMaskText((t)->dpy,(x),(p)->indexMods,(p)->indexVMods,XkbMessage)
+#define        PreserveTxt(t,x,p)      \
+       XkbVModMaskText((t)->dpy,(x),(p)->preMods,(p)->preVMods,XkbMessage)
+#define        TypeTxt(t)      XkbAtomText((t)->dpy,(t)->name,XkbMessage)
+#define        TypeMaskTxt(t,x)        \
+       XkbVModMaskText((t)->dpy,(x),(t)->mask,(t)->vmask,XkbMessage)
+
+/***====================================================================***/
+
+static void
+InitKeyTypesInfo(KeyTypesInfo * info, XkbDescPtr xkb, KeyTypesInfo * from)
+{
+    tok_ONE_LEVEL = XkbInternAtom(NULL, "ONE_LEVEL", False);
+    tok_TWO_LEVEL = XkbInternAtom(NULL, "TWO_LEVEL", False);
+    tok_ALPHABETIC = XkbInternAtom(NULL, "ALPHABETIC", False);
+    tok_KEYPAD = XkbInternAtom(NULL, "KEYPAD", False);
+    info->dpy = NULL;
+    info->name = uStringDup("default");
+    info->errorCount = 0;
+    info->stdPresent = 0;
+    info->nTypes = 0;
+    info->types = NULL;
+    info->dflt.defs.defined = 0;
+    info->dflt.defs.fileID = 0;
+    info->dflt.defs.merge = MergeOverride;
+    info->dflt.defs.next = NULL;
+    info->dflt.name = None;
+    info->dflt.mask = 0;
+    info->dflt.vmask = 0;
+    info->dflt.groupInfo = False;
+    info->dflt.numLevels = 1;
+    info->dflt.nEntries = info->dflt.szEntries = 0;
+    info->dflt.entries = NULL;
+    info->dflt.szNames = 0;
+    info->dflt.lvlNames = NULL;
+    info->dflt.preserve = NULL;
+    InitVModInfo(&info->vmods, xkb);
+    if (from != NULL)
+    {
+        info->dpy = from->dpy;
+        info->dflt = from->dflt;
+        if (from->dflt.entries)
+        {
+            info->dflt.entries = uTypedCalloc(from->dflt.szEntries,
+                                              XkbKTMapEntryRec);
+            if (info->dflt.entries)
+            {
+                unsigned sz = from->dflt.nEntries * sizeof(XkbKTMapEntryRec);
+                memcpy(info->dflt.entries, from->dflt.entries, sz);
+            }
+        }
+        if (from->dflt.lvlNames)
+        {
+            info->dflt.lvlNames = uTypedCalloc(from->dflt.szNames, Atom);
+            if (info->dflt.lvlNames)
+            {
+                register unsigned sz = from->dflt.szNames * sizeof(Atom);
+                memcpy(info->dflt.lvlNames, from->dflt.lvlNames, sz);
+            }
+        }
+        if (from->dflt.preserve)
+        {
+            PreserveInfo *old, *new, *last;
+            last = NULL;
+            old = from->dflt.preserve;
+            for (; old; old = (PreserveInfo *) old->defs.next)
+            {
+                new = uTypedAlloc(PreserveInfo);
+                if (!new)
+                    return;
+                *new = *old;
+                new->defs.next = NULL;
+                if (last)
+                    last->defs.next = (CommonInfo *) new;
+                else
+                    info->dflt.preserve = new;
+                last = new;
+            }
+        }
+    }
+    return;
+}
+
+static void
+FreeKeyTypeInfo(KeyTypeInfo * type)
+{
+    if (type->entries != NULL)
+    {
+        uFree(type->entries);
+        type->entries = NULL;
+    }
+    if (type->lvlNames != NULL)
+    {
+        uFree(type->lvlNames);
+        type->lvlNames = NULL;
+    }
+    if (type->preserve != NULL)
+    {
+        ClearCommonInfo(&type->preserve->defs);
+        type->preserve = NULL;
+    }
+    return;
+}
+
+static void
+FreeKeyTypesInfo(KeyTypesInfo * info)
+{
+    info->dpy = NULL;
+    if (info->name)
+        uFree(info->name);
+    info->name = NULL;
+    if (info->types)
+    {
+        register KeyTypeInfo *type;
+        for (type = info->types; type; type = (KeyTypeInfo *) type->defs.next)
+        {
+            FreeKeyTypeInfo(type);
+        }
+        info->types = (KeyTypeInfo *) ClearCommonInfo(&info->types->defs);
+    }
+    FreeKeyTypeInfo(&info->dflt);
+    return;
+}
+
+static KeyTypeInfo *
+NextKeyType(KeyTypesInfo * info)
+{
+    KeyTypeInfo *type;
+
+    type = uTypedAlloc(KeyTypeInfo);
+    if (type != NULL)
+    {
+        bzero(type, sizeof(KeyTypeInfo));
+        type->defs.fileID = info->fileID;
+        type->dpy = info->dpy;
+        info->types = (KeyTypeInfo *) AddCommonInfo(&info->types->defs,
+                                                    (CommonInfo *) type);
+        info->nTypes++;
+    }
+    return type;
+}
+
+static KeyTypeInfo *
+FindMatchingKeyType(KeyTypesInfo * info, KeyTypeInfo * new)
+{
+    KeyTypeInfo *old;
+
+    for (old = info->types; old; old = (KeyTypeInfo *) old->defs.next)
+    {
+        if (old->name == new->name)
+            return old;
+    }
+    return NULL;
+}
+
+static Bool
+ReportTypeBadWidth(const char *type, int has, int needs)
+{
+    ERROR3("Key type \"%s\" has %d levels, must have %d\n", type, has, needs);
+    ACTION("Illegal type definition ignored\n");
+    return False;
+}
+
+static Bool
+AddKeyType(XkbDescPtr xkb, KeyTypesInfo * info, KeyTypeInfo * new)
+{
+    KeyTypeInfo *old;
+
+    if (new->name == tok_ONE_LEVEL)
+    {
+        if (new->numLevels > 1)
+            return ReportTypeBadWidth("ONE_LEVEL", new->numLevels, 1);
+        info->stdPresent |= XkbOneLevelMask;
+    }
+    else if (new->name == tok_TWO_LEVEL)
+    {
+        if (new->numLevels > 2)
+            return ReportTypeBadWidth("TWO_LEVEL", new->numLevels, 2);
+        else if (new->numLevels < 2)
+            new->numLevels = 2;
+        info->stdPresent |= XkbTwoLevelMask;
+    }
+    else if (new->name == tok_ALPHABETIC)
+    {
+        if (new->numLevels > 2)
+            return ReportTypeBadWidth("ALPHABETIC", new->numLevels, 2);
+        else if (new->numLevels < 2)
+            new->numLevels = 2;
+        info->stdPresent |= XkbAlphabeticMask;
+    }
+    else if (new->name == tok_KEYPAD)
+    {
+        if (new->numLevels > 2)
+            return ReportTypeBadWidth("KEYPAD", new->numLevels, 2);
+        else if (new->numLevels < 2)
+            new->numLevels = 2;
+        info->stdPresent |= XkbKeypadMask;
+    }
+
+    old = FindMatchingKeyType(info, new);
+    if (old != NULL)
+    {
+        Bool report;
+        if ((new->defs.merge == MergeReplace)
+            || (new->defs.merge == MergeOverride))
+        {
+            KeyTypeInfo *next = (KeyTypeInfo *) old->defs.next;
+            if (((old->defs.fileID == new->defs.fileID)
+                 && (warningLevel > 0)) || (warningLevel > 9))
+            {
+                WARN1("Multiple definitions of the %s key type\n",
+                      XkbAtomGetString(NULL, new->name));
+                ACTION("Earlier definition ignored\n");
+            }
+            FreeKeyTypeInfo(old);
+            *old = *new;
+            new->szEntries = new->nEntries = 0;
+            new->entries = NULL;
+            new->preserve = NULL;
+            new->lvlNames = NULL;
+            old->defs.next = &next->defs;
+            return True;
+        }
+        report = (old->defs.fileID == new->defs.fileID) && (warningLevel > 0);
+        if (report)
+        {
+            WARN1("Multiple definitions of the %s key type\n",
+                  XkbAtomGetString(NULL, new->name));
+            ACTION("Later definition ignored\n");
+        }
+        FreeKeyTypeInfo(new);
+        return True;
+    }
+    old = NextKeyType(info);
+    if (old == NULL)
+        return False;
+    *old = *new;
+    old->defs.next = NULL;
+    new->nEntries = new->szEntries = 0;
+    new->entries = NULL;
+    new->szNames = 0;
+    new->lvlNames = NULL;
+    new->preserve = NULL;
+    return True;
+}
+
+/***====================================================================***/
+
+static void
+MergeIncludedKeyTypes(KeyTypesInfo * into,
+                      KeyTypesInfo * from, unsigned merge, XkbDescPtr xkb)
+{
+    KeyTypeInfo *type;
+
+    if (from->errorCount > 0)
+    {
+        into->errorCount += from->errorCount;
+        return;
+    }
+    if (into->name == NULL)
+    {
+        into->name = from->name;
+        from->name = NULL;
+    }
+    for (type = from->types; type; type = (KeyTypeInfo *) type->defs.next)
+    {
+        if (merge != MergeDefault)
+            type->defs.merge = merge;
+        if (!AddKeyType(xkb, into, type))
+            into->errorCount++;
+    }
+    into->stdPresent |= from->stdPresent;
+    return;
+}
+
+typedef void (*FileHandler) (XkbFile * /* file */ ,
+                             XkbDescPtr /* xkb */ ,
+                             unsigned /* merge */ ,
+                             KeyTypesInfo *     /* included */
+    );
+
+static Bool
+HandleIncludeKeyTypes(IncludeStmt * stmt,
+                      XkbDescPtr xkb, KeyTypesInfo * info, FileHandler hndlr)
+{
+    unsigned newMerge;
+    XkbFile *rtrn;
+    KeyTypesInfo included;
+    Bool haveSelf;
+
+    haveSelf = False;
+    if ((stmt->file == NULL) && (stmt->map == NULL))
+    {
+        haveSelf = True;
+        included = *info;
+        bzero(info, sizeof(KeyTypesInfo));
+    }
+    else if (ProcessIncludeFile(stmt, XkmTypesIndex, &rtrn, &newMerge))
+    {
+        InitKeyTypesInfo(&included, xkb, info);
+        included.fileID = included.dflt.defs.fileID = rtrn->id;
+        included.dflt.defs.merge = newMerge;
+
+        (*hndlr) (rtrn, xkb, newMerge, &included);
+        if (stmt->stmt != NULL)
+        {
+            if (included.name != NULL)
+                uFree(included.name);
+            included.name = stmt->stmt;
+            stmt->stmt = NULL;
+        }
+    }
+    else
+    {
+        info->errorCount += 10;
+        return False;
+    }
+    if ((stmt->next != NULL) && (included.errorCount < 1))
+    {
+        IncludeStmt *next;
+        unsigned op;
+        KeyTypesInfo next_incl;
+
+        for (next = stmt->next; next != NULL; next = next->next)
+        {
+            if ((next->file == NULL) && (next->map == NULL))
+            {
+                haveSelf = True;
+                MergeIncludedKeyTypes(&included, info, next->merge, xkb);
+                FreeKeyTypesInfo(info);
+            }
+            else if (ProcessIncludeFile(next, XkmTypesIndex, &rtrn, &op))
+            {
+                InitKeyTypesInfo(&next_incl, xkb, &included);
+                next_incl.fileID = next_incl.dflt.defs.fileID = rtrn->id;
+                next_incl.dflt.defs.merge = op;
+                (*hndlr) (rtrn, xkb, op, &next_incl);
+                MergeIncludedKeyTypes(&included, &next_incl, op, xkb);
+                FreeKeyTypesInfo(&next_incl);
+            }
+            else
+            {
+                info->errorCount += 10;
+                return False;
+            }
+        }
+    }
+    if (haveSelf)
+        *info = included;
+    else
+    {
+        MergeIncludedKeyTypes(info, &included, newMerge, xkb);
+        FreeKeyTypesInfo(&included);
+    }
+    return (info->errorCount == 0);
+}
+
+/***====================================================================***/
+
+static XkbKTMapEntryPtr
+FindMatchingMapEntry(KeyTypeInfo * type, unsigned mask, unsigned vmask)
+{
+    register int i;
+    XkbKTMapEntryPtr entry;
+
+    for (i = 0, entry = type->entries; i < type->nEntries; i++, entry++)
+    {
+        if ((entry->mods.real_mods == mask) && (entry->mods.vmods == vmask))
+            return entry;
+    }
+    return NULL;
+}
+
+static void
+DeleteLevel1MapEntries(KeyTypeInfo * type)
+{
+    register int i, n;
+
+    for (i = 0; i < type->nEntries; i++)
+    {
+        if (type->entries[i].level == 0)
+        {
+            for (n = i; n < type->nEntries - 1; n++)
+            {
+                type->entries[n] = type->entries[n + 1];
+            }
+            type->nEntries--;
+        }
+    }
+    return;
+}
+
+/**
+ * Return a pointer to the next free XkbKTMapEntry, reallocating space if
+ * necessary.
+ */
+static XkbKTMapEntryPtr
+NextMapEntry(KeyTypeInfo * type)
+{
+    if (type->entries == NULL)
+    {
+        type->entries = uTypedCalloc(2, XkbKTMapEntryRec);
+        if (type->entries == NULL)
+        {
+            ERROR1("Couldn't allocate map entries for %s\n", TypeTxt(type));
+            ACTION("Map entries lost\n");
+            return NULL;
+        }
+        type->szEntries = 2;
+        type->nEntries = 0;
+    }
+    else if (type->nEntries >= type->szEntries)
+    {
+        type->szEntries *= 2;
+        type->entries = uTypedRecalloc(type->entries,
+                                       type->nEntries, type->szEntries,
+                                       XkbKTMapEntryRec);
+        if (type->entries == NULL)
+        {
+            ERROR1("Couldn't reallocate map entries for %s\n", TypeTxt(type));
+            ACTION("Map entries lost\n");
+            return NULL;
+        }
+    }
+    return &type->entries[type->nEntries++];
+}
+
+Bool
+AddPreserve(XkbDescPtr xkb,
+            KeyTypeInfo * type, PreserveInfo * new, Bool clobber, Bool report)
+{
+    PreserveInfo *old;
+
+    old = type->preserve;
+    while (old != NULL)
+    {
+        if ((old->indexMods != new->indexMods) ||
+            (old->indexVMods != new->indexVMods))
+        {
+            old = (PreserveInfo *) old->defs.next;
+            continue;
+        }
+        if ((old->preMods == new->preMods)
+            && (old->preVMods == new->preVMods))
+        {
+            if (warningLevel > 9)
+            {
+                WARN2("Identical definitions for preserve[%s] in %s\n",
+                      PreserveIndexTxt(type, xkb, old), TypeTxt(type));
+                ACTION("Ignored\n");
+            }
+            return True;
+        }
+        if (report && (warningLevel > 0))
+        {
+            char *str;
+            WARN2("Multiple definitions for preserve[%s] in %s\n",
+                  PreserveIndexTxt(type, xkb, old), TypeTxt(type));
+
+            if (clobber)
+                str = PreserveTxt(type, xkb, new);
+            else
+                str = PreserveTxt(type, xkb, old);
+            ACTION1("Using %s, ", str);
+            if (clobber)
+                str = PreserveTxt(type, xkb, old);
+            else
+                str = PreserveTxt(type, xkb, new);
+            INFO1("ignoring %s\n", str);
+        }
+        if (clobber)
+        {
+            old->preMods = new->preMods;
+            old->preVMods = new->preVMods;
+        }
+        return True;
+    }
+    old = uTypedAlloc(PreserveInfo);
+    if (!old)
+    {
+        WSGO1("Couldn't allocate preserve in %s\n", TypeTxt(type));
+        ACTION1("Preserve[%s] lost\n", PreserveIndexTxt(type, xkb, old));
+        return False;
+    }
+    *old = *new;
+    old->matchingMapIndex = -1;
+    type->preserve =
+        (PreserveInfo *) AddCommonInfo(&type->preserve->defs, &old->defs);
+    return True;
+}
+
+/**
+ * Add a new KTMapEntry to the given key type. If an entry with the same mods
+ * already exists, the level is updated (if clobber is TRUE). Otherwise, a new
+ * entry is created.
+ *
+ * @param clobber Overwrite existing entry.
+ * @param report True if a warning is to be printed on.
+ */
+Bool
+AddMapEntry(XkbDescPtr xkb,
+            KeyTypeInfo * type,
+            XkbKTMapEntryPtr new, Bool clobber, Bool report)
+{
+    XkbKTMapEntryPtr old;
+
+    if ((old =
+         FindMatchingMapEntry(type, new->mods.real_mods, new->mods.vmods)))
+    {
+        if (report && (old->level != new->level))
+        {
+            unsigned use, ignore;
+            if (clobber)
+            {
+                use = new->level + 1;
+                ignore = old->level + 1;
+            }
+            else
+            {
+                use = old->level + 1;
+                ignore = new->level + 1;
+            }
+            WARN2("Multiple map entries for %s in %s\n",
+                  MapEntryTxt(type, xkb, new), TypeTxt(type));
+            ACTION2("Using %d, ignoring %d\n", use, ignore);
+        }
+        else if (warningLevel > 9)
+        {
+            WARN3("Multiple occurences of map[%s]= %d in %s\n",
+                  MapEntryTxt(type, xkb, new), new->level + 1, TypeTxt(type));
+            ACTION("Ignored\n");
+            return True;
+        }
+        if (clobber)
+            old->level = new->level;
+        return True;
+    }
+    if ((old = NextMapEntry(type)) == NULL)
+        return False;           /* allocation failure, already reported */
+    if (new->level >= type->numLevels)
+        type->numLevels = new->level + 1;
+    if (new->mods.vmods == 0)
+        old->active = True;
+    else
+        old->active = False;
+    old->mods.mask = new->mods.real_mods;
+    old->mods.real_mods = new->mods.real_mods;
+    old->mods.vmods = new->mods.vmods;
+    old->level = new->level;
+    return True;
+}
+
+static LookupEntry lnames[] = {
+    {"level1", 1},
+    {"level2", 2},
+    {"level3", 3},
+    {"level4", 4},
+    {"level5", 5},
+    {"level6", 6},
+    {"level7", 7},
+    {"level8", 8},
+    {NULL, 0}
+};
+
+static Bool
+SetMapEntry(KeyTypeInfo * type,
+            XkbDescPtr xkb, ExprDef * arrayNdx, ExprDef * value)
+{
+    ExprResult rtrn;
+    XkbKTMapEntryRec entry;
+
+    if (arrayNdx == NULL)
+        return ReportTypeShouldBeArray(type, "map entry");
+    if (!ExprResolveModMask(arrayNdx, &rtrn, LookupVModMask, (XPointer) xkb))
+        return ReportTypeBadType(type, "map entry", "modifier mask");
+    entry.mods.real_mods = rtrn.uval & 0xff;      /* modifiers < 512 */
+    entry.mods.vmods = (rtrn.uval >> 8) & 0xffff; /* modifiers > 512 */
+    if ((entry.mods.real_mods & (~type->mask)) ||
+        ((entry.mods.vmods & (~type->vmask)) != 0))
+    {
+        if (warningLevel > 0)
+        {
+            WARN1("Map entry for unused modifiers in %s\n", TypeTxt(type));
+            ACTION1("Using %s instead of ",
+                    XkbVModMaskText(type->dpy, xkb,
+                                    entry.mods.real_mods & type->mask,
+                                    entry.mods.vmods & type->vmask,
+                                    XkbMessage));
+            INFO1("%s\n", MapEntryTxt(type, xkb, &entry));
+        }
+        entry.mods.real_mods &= type->mask;
+        entry.mods.vmods &= type->vmask;
+    }
+    if (!ExprResolveInteger(value, &rtrn, SimpleLookup, (XPointer) lnames))
+    {
+        ERROR("Level specifications in a key type must be integer\n");
+        ACTION("Ignoring malformed level specification\n");
+        return False;
+    }
+    if ((rtrn.ival < 1) || (rtrn.ival > XkbMaxShiftLevel + 1))
+    {
+        ERROR3("Shift level %d out of range (1..%d) in key type %s\n",
+               XkbMaxShiftLevel + 1, rtrn.ival, TypeTxt(type));
+        ACTION1("Ignoring illegal definition of map[%s]\n",
+                MapEntryTxt(type, xkb, &entry));
+        return False;
+    }
+    entry.level = rtrn.ival - 1;
+    return AddMapEntry(xkb, type, &entry, True, True);
+}
+
+static Bool
+SetPreserve(KeyTypeInfo * type,
+            XkbDescPtr xkb, ExprDef * arrayNdx, ExprDef * value)
+{
+    ExprResult rtrn;
+    PreserveInfo new;
+
+    if (arrayNdx == NULL)
+        return ReportTypeShouldBeArray(type, "preserve entry");
+    if (!ExprResolveModMask(arrayNdx, &rtrn, LookupVModMask, (XPointer) xkb))
+        return ReportTypeBadType(type, "preserve entry", "modifier mask");
+    new.defs = type->defs;
+    new.defs.next = NULL;
+    new.indexMods = rtrn.uval & 0xff;
+    new.indexVMods = (rtrn.uval >> 8) & 0xffff;
+    if ((new.indexMods & (~type->mask)) || (new.indexVMods & (~type->vmask)))
+    {
+        if (warningLevel > 0)
+        {
+            WARN1("Preserve for modifiers not used by the %s type\n",
+                  TypeTxt(type));
+            ACTION1("Index %s converted to ",
+                    PreserveIndexTxt(type, xkb, &new));
+        }
+        new.indexMods &= type->mask;
+        new.indexVMods &= type->vmask;
+        if (warningLevel > 0)
+            INFO1("%s\n", PreserveIndexTxt(type, xkb, &new));
+    }
+    if (!ExprResolveModMask(value, &rtrn, LookupVModMask, (XPointer) xkb))
+    {
+        ERROR("Preserve value in a key type is not a modifier mask\n");
+        ACTION2("Ignoring preserve[%s] in type %s\n",
+                PreserveIndexTxt(type, xkb, &new), TypeTxt(type));
+        return False;
+    }
+    new.preMods = rtrn.uval & 0xff;
+    new.preVMods = (rtrn.uval >> 16) & 0xffff;
+    if ((new.preMods & (~new.indexMods))
+        || (new.preVMods && (~new.indexVMods)))
+    {
+        if (warningLevel > 0)
+        {
+            WARN2("Illegal value for preserve[%s] in type %s\n",
+                  PreserveTxt(type, xkb, &new), TypeTxt(type));
+            ACTION1("Converted %s to ", PreserveIndexTxt(type, xkb, &new));
+        }
+        new.preMods &= new.indexMods;
+        new.preVMods &= new.indexVMods;
+        if (warningLevel > 0)
+        {
+            INFO1("%s\n", PreserveIndexTxt(type, xkb, &new));
+        }
+    }
+    return AddPreserve(xkb, type, &new, True, True);
+}
+
+/***====================================================================***/
+
+Bool
+AddLevelName(KeyTypeInfo * type,
+             unsigned level, Atom name, Bool clobber, Bool report)
+{
+    if ((type->lvlNames == NULL) || (type->szNames <= level))
+    {
+        type->lvlNames =
+            uTypedRecalloc(type->lvlNames, type->szNames, level + 1, Atom);
+        if (type->lvlNames == NULL)
+        {
+            ERROR1("Couldn't allocate level names for type %s\n",
+                   TypeTxt(type));
+            ACTION("Level names lost\n");
+            type->szNames = 0;
+            return False;
+        }
+        type->szNames = level + 1;
+    }
+    else if (type->lvlNames[level] == name)
+    {
+        if (warningLevel > 9)
+        {
+            WARN2("Duplicate names for level %d of key type %s\n",
+                  level + 1, TypeTxt(type));
+            ACTION("Ignored\n");
+        }
+        return True;
+    }
+    else if (type->lvlNames[level] != None)
+    {
+        if (warningLevel > 0)
+        {
+            char *old, *new;
+            old = XkbAtomText(type->dpy, type->lvlNames[level], XkbMessage);
+            new = XkbAtomText(type->dpy, name, XkbMessage);
+            WARN2("Multiple names for level %d of key type %s\n",
+                  level + 1, TypeTxt(type));
+            if (clobber)
+                ACTION2("Using %s, ignoring %s\n", new, old);
+            else
+                ACTION2("Using %s, ignoring %s\n", old, new);
+        }
+        if (!clobber)
+            return True;
+    }
+    if (level >= type->numLevels)
+        type->numLevels = level + 1;
+    type->lvlNames[level] = name;
+    return True;
+}
+
+static Bool
+SetLevelName(KeyTypeInfo * type, ExprDef * arrayNdx, ExprDef * value)
+{
+    ExprResult rtrn;
+    unsigned level;
+
+    if (arrayNdx == NULL)
+        return ReportTypeShouldBeArray(type, "level name");
+    if (!ExprResolveInteger(arrayNdx, &rtrn, SimpleLookup, (XPointer) lnames))
+        return ReportTypeBadType(type, "level name", "integer");
+    if ((rtrn.ival < 1) || (rtrn.ival > XkbMaxShiftLevel + 1))
+    {
+        ERROR3("Level name %d out of range (1..%d) in key type %s\n",
+               rtrn.ival,
+               XkbMaxShiftLevel + 1,
+               XkbAtomText(type->dpy, type->name, XkbMessage));
+        ACTION("Ignoring illegal level name definition\n");
+        return False;
+    }
+    level = rtrn.ival - 1;
+    if (!ExprResolveString(value, &rtrn, NULL, NULL))
+    {
+        ERROR2("Non-string name for level %d in key type %s\n", level + 1,
+               XkbAtomText(type->dpy, type->name, XkbMessage));
+        ACTION("Ignoring illegal level name definition\n");
+        return False;
+    }
+    return
+        AddLevelName(type, level, XkbInternAtom(NULL, rtrn.str, False), True,
+                     True);
+}
+
+/***====================================================================***/
+
+/**
+ * Parses the fields in a type "..." { } description.
+ *
+ * @param field The field to parse (e.g. modifiers, map, level_name)
+ */
+static Bool
+SetKeyTypeField(KeyTypeInfo * type,
+                XkbDescPtr xkb,
+                char *field,
+                ExprDef * arrayNdx, ExprDef * value, KeyTypesInfo * info)
+{
+    ExprResult tmp;
+
+    if (uStrCaseCmp(field, "modifiers") == 0)
+    {
+        unsigned mods, vmods;
+        if (arrayNdx != NULL)
+        {
+            WARN("The modifiers field of a key type is not an array\n");
+            ACTION("Illegal array subscript ignored\n");
+        }
+        /* get modifier mask for current type */
+        if (!ExprResolveModMask(value, &tmp, LookupVModMask, (XPointer) xkb))
+        {
+            ERROR("Key type mask field must be a modifier mask\n");
+            ACTION("Key type definition ignored\n");
+            return False;
+        }
+        mods = tmp.uval & 0xff; /* core mods */
+        vmods = (tmp.uval >> 8) & 0xffff; /* xkb virtual mods */
+        if (type->defs.defined & _KT_Mask)
+        {
+            WARN1("Multiple modifier mask definitions for key type %s\n",
+                  XkbAtomText(type->dpy, type->name, XkbMessage));
+            ACTION1("Using %s, ", TypeMaskTxt(type, xkb));
+            INFO1("ignoring %s\n", XkbVModMaskText(type->dpy, xkb, mods,
+                                                   vmods, XkbMessage));
+            return False;
+        }
+        type->mask = mods;
+        type->vmask = vmods;
+        type->defs.defined |= _KT_Mask;
+        return True;
+    }
+    else if (uStrCaseCmp(field, "map") == 0)
+    {
+        type->defs.defined |= _KT_Map;
+        return SetMapEntry(type, xkb, arrayNdx, value);
+    }
+    else if (uStrCaseCmp(field, "preserve") == 0)
+    {
+        type->defs.defined |= _KT_Preserve;
+        return SetPreserve(type, xkb, arrayNdx, value);
+    }
+    else if ((uStrCaseCmp(field, "levelname") == 0) ||
+             (uStrCaseCmp(field, "level_name") == 0))
+    {
+        type->defs.defined |= _KT_LevelNames;
+        return SetLevelName(type, arrayNdx, value);
+    }
+    ERROR2("Unknown field %s in key type %s\n", field, TypeTxt(type));
+    ACTION("Definition ignored\n");
+    return False;
+}
+
+static Bool
+HandleKeyTypeVar(VarDef * stmt, XkbDescPtr xkb, KeyTypesInfo * info)
+{
+    ExprResult elem, field;
+    ExprDef *arrayNdx;
+
+    if (!ExprResolveLhs(stmt->name, &elem, &field, &arrayNdx))
+        return False;           /* internal error, already reported */
+    if (elem.str && (uStrCaseCmp(elem.str, "type") == 0))
+        return SetKeyTypeField(&info->dflt, xkb, field.str, arrayNdx,
+                               stmt->value, info);
+    if (elem.str != NULL)
+    {
+        ERROR1("Default for unknown element %s\n", uStringText(elem.str));
+        ACTION1("Value for field %s ignored\n", uStringText(field.str));
+    }
+    else if (field.str != NULL)
+    {
+        ERROR1("Default defined for unknown field %s\n",
+               uStringText(field.str));
+        ACTION("Ignored\n");
+    }
+    return False;
+}
+
+static int
+HandleKeyTypeBody(VarDef * def,
+                  XkbDescPtr xkb, KeyTypeInfo * type, KeyTypesInfo * info)
+{
+    int ok = 1;
+    ExprResult tmp, field;
+    ExprDef *arrayNdx;
+
+    for (; def != NULL; def = (VarDef *) def->common.next)
+    {
+        if ((def->name) && (def->name->type == ExprFieldRef))
+        {
+            ok = HandleKeyTypeVar(def, xkb, info);
+            continue;
+        }
+        ok = ExprResolveLhs(def->name, &tmp, &field, &arrayNdx);
+        if (ok)
+            ok = SetKeyTypeField(type, xkb, field.str, arrayNdx, def->value,
+                                 info);
+    }
+    return ok;
+}
+
+/**
+ * Process a type "XYZ" { } specification in the xkb_types section.
+ *
+ */
+static int
+HandleKeyTypeDef(KeyTypeDef * def,
+                 XkbDescPtr xkb, unsigned merge, KeyTypesInfo * info)
+{
+    register int i;
+    KeyTypeInfo type;
+
+    if (def->merge != MergeDefault)
+        merge = def->merge;
+
+    type.defs.defined = 0;
+    type.defs.fileID = info->fileID;
+    type.defs.merge = merge;
+    type.defs.next = NULL;
+    type.dpy = info->dpy;
+    type.name = def->name;
+    type.mask = info->dflt.mask;
+    type.vmask = info->dflt.vmask;
+    type.groupInfo = info->dflt.groupInfo;
+    type.numLevels = 1;
+    type.nEntries = type.szEntries = 0;
+    type.entries = NULL;
+    type.szNames = 0;
+    type.lvlNames = NULL;
+    type.preserve = NULL;
+
+    /* Parse the actual content. */
+    if (!HandleKeyTypeBody(def->body, xkb, &type, info))
+    {
+        info->errorCount++;
+        return False;
+    }
+
+    /* now copy any appropriate map, preserve or level names from the */
+    /* default type */
+    for (i = 0; i < info->dflt.nEntries; i++)
+    {
+        XkbKTMapEntryPtr dflt;
+        dflt = &info->dflt.entries[i];
+        if (((dflt->mods.real_mods & type.mask) == dflt->mods.real_mods) &&
+            ((dflt->mods.vmods & type.vmask) == dflt->mods.vmods))
+        {
+            AddMapEntry(xkb, &type, dflt, False, False);
+        }
+    }
+    if (info->dflt.preserve)
+    {
+        PreserveInfo *dflt = info->dflt.preserve;
+        while (dflt)
+        {
+            if (((dflt->indexMods & type.mask) == dflt->indexMods) &&
+                ((dflt->indexVMods & type.vmask) == dflt->indexVMods))
+            {
+                AddPreserve(xkb, &type, dflt, False, False);
+            }
+            dflt = (PreserveInfo *) dflt->defs.next;
+        }
+    }
+    for (i = 0; i < info->dflt.szNames; i++)
+    {
+        if ((i < type.numLevels) && (info->dflt.lvlNames[i] != None))
+        {
+            AddLevelName(&type, i, info->dflt.lvlNames[i], False, False);
+        }
+    }
+    /* Now add the new keytype to the info struct */
+    if (!AddKeyType(xkb, info, &type))
+    {
+        info->errorCount++;
+        return False;
+    }
+    return True;
+}
+
+/**
+ * Process an xkb_types section.
+ *
+ * @param file The parsed xkb_types section.
+ * @param merge Merge Strategy (e.g. MergeOverride)
+ * @param info Pointer to memory where the outcome will be stored.
+ */
+static void
+HandleKeyTypesFile(XkbFile * file,
+                   XkbDescPtr xkb, unsigned merge, KeyTypesInfo * info)
+{
+    ParseCommon *stmt;
+
+    info->name = uStringDup(file->name);
+    stmt = file->defs;
+    while (stmt)
+    {
+        switch (stmt->stmtType)
+        {
+        case StmtInclude:
+            if (!HandleIncludeKeyTypes((IncludeStmt *) stmt, xkb, info,
+                                       HandleKeyTypesFile))
+                info->errorCount++;
+            break;
+        case StmtKeyTypeDef: /* e.g. type "ONE_LEVEL" */
+            if (!HandleKeyTypeDef((KeyTypeDef *) stmt, xkb, merge, info))
+                info->errorCount++;
+            break;
+        case StmtVarDef:
+            if (!HandleKeyTypeVar((VarDef *) stmt, xkb, info))
+                info->errorCount++;
+            break;
+        case StmtVModDef: /* virtual_modifiers NumLock, ... */
+            if (!HandleVModDef((VModDef *) stmt, merge, &info->vmods))
+                info->errorCount++;
+            break;
+        case StmtKeyAliasDef:
+            ERROR("Key type files may not include other declarations\n");
+            ACTION("Ignoring definition of key alias\n");
+            info->errorCount++;
+            break;
+        case StmtKeycodeDef:
+            ERROR("Key type files may not include other declarations\n");
+            ACTION("Ignoring definition of key name\n");
+            info->errorCount++;
+            break;
+        case StmtInterpDef:
+            ERROR("Key type files may not include other declarations\n");
+            ACTION("Ignoring definition of symbol interpretation\n");
+            info->errorCount++;
+            break;
+        default:
+            WSGO1("Unexpected statement type %d in HandleKeyTypesFile\n",
+                  stmt->stmtType);
+            break;
+        }
+        stmt = stmt->next;
+        if (info->errorCount > 10)
+        {
+#ifdef NOISY
+            ERROR("Too many errors\n");
+#endif
+            ACTION1("Abandoning keytypes file \"%s\"\n", file->topName);
+            break;
+        }
+    }
+    return;
+}
+
+static Bool
+CopyDefToKeyType(XkbDescPtr xkb, XkbKeyTypePtr type, KeyTypeInfo * def)
+{
+    register int i;
+    PreserveInfo *pre;
+
+    for (pre = def->preserve; pre != NULL;
+         pre = (PreserveInfo *) pre->defs.next)
+    {
+        XkbKTMapEntryPtr match;
+        XkbKTMapEntryRec tmp;
+        tmp.mods.real_mods = pre->indexMods;
+        tmp.mods.vmods = pre->indexVMods;
+        tmp.level = 0;
+        AddMapEntry(xkb, def, &tmp, False, False);
+        match = FindMatchingMapEntry(def, pre->indexMods, pre->indexVMods);
+        if (!match)
+        {
+            WSGO("Couldn't find matching entry for preserve\n");
+            ACTION("Aborting\n");
+            return False;
+        }
+        pre->matchingMapIndex = match - def->entries;
+    }
+    type->mods.real_mods = def->mask;
+    type->mods.vmods = def->vmask;
+    type->num_levels = def->numLevels;
+    type->map_count = def->nEntries;
+    type->map = def->entries;
+    if (def->preserve)
+    {
+        type->preserve = uTypedCalloc(type->map_count, XkbModsRec);
+        if (!type->preserve)
+        {
+            WARN("Couldn't allocate preserve array in CopyDefToKeyType\n");
+            ACTION1("Preserve setting for type %s lost\n",
+                    XkbAtomText(def->dpy, def->name, XkbMessage));
+        }
+        else
+        {
+            pre = def->preserve;
+            for (; pre != NULL; pre = (PreserveInfo *) pre->defs.next)
+            {
+                int ndx = pre->matchingMapIndex;
+                type->preserve[ndx].mask = pre->preMods;
+                type->preserve[ndx].real_mods = pre->preMods;
+                type->preserve[ndx].vmods = pre->preVMods;
+            }
+        }
+    }
+    else
+        type->preserve = NULL;
+    type->name = (Atom) def->name;
+    if (def->szNames > 0)
+    {
+        type->level_names = uTypedCalloc(def->numLevels, Atom);
+
+        /* assert def->szNames<=def->numLevels */
+        for (i = 0; i < def->szNames; i++)
+        {
+            type->level_names[i] = (Atom) def->lvlNames[i];
+        }
+    }
+    else
+    {
+        type->level_names = NULL;
+    }
+
+    def->nEntries = def->szEntries = 0;
+    def->entries = NULL;
+    return XkbComputeEffectiveMap(xkb, type, NULL);
+}
+
+Bool
+CompileKeyTypes(XkbFile * file, XkbFileInfo * result, unsigned merge)
+{
+    KeyTypesInfo info;
+    XkbDescPtr xkb;
+
+    xkb = result->xkb;
+    InitKeyTypesInfo(&info, xkb, NULL);
+    info.fileID = file->id;
+    HandleKeyTypesFile(file, xkb, merge, &info);
+
+    if (info.errorCount == 0)
+    {
+        register int i;
+        register KeyTypeInfo *def;
+        register XkbKeyTypePtr type, next;
+
+        if (info.name != NULL)
+        {
+            if (XkbAllocNames(xkb, XkbTypesNameMask, 0, 0) == Success)
+                xkb->names->types = XkbInternAtom(xkb->dpy, info.name, False);
+            else
+            {
+                WSGO("Couldn't allocate space for types name\n");
+                ACTION2("Name \"%s\" (from %s) NOT assigned\n",
+                        scanFile, info.name);
+            }
+        }
+        i = info.nTypes;
+        if ((info.stdPresent & XkbOneLevelMask) == 0)
+            i++;
+        if ((info.stdPresent & XkbTwoLevelMask) == 0)
+            i++;
+        if ((info.stdPresent & XkbKeypadMask) == 0)
+            i++;
+        if ((info.stdPresent & XkbAlphabeticMask) == 0)
+            i++;
+        if (XkbAllocClientMap(xkb, XkbKeyTypesMask, i) != Success)
+        {
+            WSGO("Couldn't allocate client map\n");
+            ACTION("Exiting\n");
+            return False;
+        }
+        xkb->map->num_types = i;
+        if (XkbAllRequiredTypes & (~info.stdPresent))
+        {
+            unsigned missing, keypadVMod;
+
+            missing = XkbAllRequiredTypes & (~info.stdPresent);
+            keypadVMod = FindKeypadVMod(xkb);
+            if (XkbInitCanonicalKeyTypes(xkb, missing, keypadVMod) != Success)
+            {
+                WSGO("Couldn't initialize canonical key types\n");
+                ACTION("Exiting\n");
+                return False;
+            }
+            if (missing & XkbOneLevelMask)
+                xkb->map->types[XkbOneLevelIndex].name = tok_ONE_LEVEL;
+            if (missing & XkbTwoLevelMask)
+                xkb->map->types[XkbTwoLevelIndex].name = tok_TWO_LEVEL;
+            if (missing & XkbAlphabeticMask)
+                xkb->map->types[XkbAlphabeticIndex].name = tok_ALPHABETIC;
+            if (missing & XkbKeypadMask)
+                xkb->map->types[XkbKeypadIndex].name = tok_KEYPAD;
+        }
+        next = &xkb->map->types[XkbLastRequiredType + 1];
+        for (i = 0, def = info.types; i < info.nTypes; i++)
+        {
+            if (def->name == tok_ONE_LEVEL)
+                type = &xkb->map->types[XkbOneLevelIndex];
+            else if (def->name == tok_TWO_LEVEL)
+                type = &xkb->map->types[XkbTwoLevelIndex];
+            else if (def->name == tok_ALPHABETIC)
+                type = &xkb->map->types[XkbAlphabeticIndex];
+            else if (def->name == tok_KEYPAD)
+                type = &xkb->map->types[XkbKeypadIndex];
+            else
+                type = next++;
+            DeleteLevel1MapEntries(def);
+            if (!CopyDefToKeyType(xkb, type, def))
+                return False;
+            def = (KeyTypeInfo *) def->defs.next;
+        }
+        return True;
+    }
+    return False;
+}
diff --git a/listing.c b/listing.c
new file mode 100644 (file)
index 0000000..146ecba
--- /dev/null
+++ b/listing.c
@@ -0,0 +1,495 @@
+/************************************************************
+ Copyright 1996 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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.
+
+ ********************************************************/
+/***********************************************************
+
+Copyright 1988, 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.
+
+
+Copyright 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its 
+documentation for any purpose and without fee is hereby granted, 
+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 Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.  
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL 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>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <X11/keysym.h>
+
+#if defined(sgi)
+#include <malloc.h>
+#endif
+
+#define        DEBUG_VAR listingDebug
+#include "xkbcomp.h"
+#include <stdlib.h>
+
+#ifdef _POSIX_SOURCE
+# include <limits.h>
+#else
+# define _POSIX_SOURCE
+# include <limits.h>
+# undef _POSIX_SOURCE
+#endif
+
+#ifndef PATH_MAX
+#ifdef WIN32
+#define PATH_MAX 512
+#else
+#include <sys/param.h>
+#endif
+#ifndef PATH_MAX
+#ifdef MAXPATHLEN
+#define PATH_MAX MAXPATHLEN
+#else
+#define PATH_MAX 1024
+#endif
+#endif
+#endif
+
+#ifdef WIN32
+# include <windows.h>
+# define FileName(file) file.cFileName
+# undef TEXT
+# undef ALTERNATE
+#else
+# include <dirent.h>
+# define FileName(file) file->d_name
+#endif
+
+#include "xkbpath.h"
+#include "parseutils.h"
+#include "misc.h"
+#include "tokens.h"
+#include <X11/extensions/XKBgeom.h>
+
+#define        lowbit(x)       ((x) & (-(x)))
+
+unsigned int listingDebug;
+
+static int szListing = 0;
+static int nListed = 0;
+static int nFilesListed = 0;
+
+typedef struct _Listing
+{
+    char *file;
+    char *map;
+} Listing;
+
+static int szMapOnly;
+static int nMapOnly;
+static char **mapOnly;
+
+static Listing *list = NULL;
+
+/***====================================================================***/
+
+int
+AddMapOnly(char *map)
+{
+    if (nMapOnly >= szMapOnly)
+    {
+        if (szMapOnly < 1)
+            szMapOnly = 5;
+        else
+            szMapOnly *= 2;
+        mapOnly = uTypedRealloc(list, szMapOnly, char *);
+        if (!mapOnly)
+        {
+            WSGO("Couldn't allocate list of maps\n");
+            return 0;
+        }
+    }
+    mapOnly[nMapOnly++] = map;
+    return 1;
+}
+
+int
+AddListing(char *file, char *map)
+{
+    if (nListed >= szListing)
+    {
+        if (szListing < 1)
+            szListing = 10;
+        else
+            szListing *= 2;
+        list = uTypedRealloc(list, szListing, Listing);
+        if (!list)
+        {
+            WSGO("Couldn't allocate list of files and maps\n");
+            ACTION("Exiting\n");
+            exit(1);
+        }
+    }
+
+    list[nListed].file = file;
+    list[nListed].map = map;
+    nListed++;
+    if (file != NULL)
+        nFilesListed++;
+    return 1;
+}
+
+/***====================================================================***/
+
+static void
+ListFile(FILE * outFile, char *fileName, XkbFile * map)
+{
+    register unsigned flags;
+    char *mapName;
+
+    flags = map->flags;
+    if ((flags & XkbLC_Hidden) && (!(verboseLevel & WantHiddenMaps)))
+        return;
+    if ((flags & XkbLC_Partial) && (!(verboseLevel & WantPartialMaps)))
+        return;
+    if (verboseLevel & WantLongListing)
+    {
+        fprintf(outFile, (flags & XkbLC_Hidden) ? "h" : "-");
+        fprintf(outFile, (flags & XkbLC_Default) ? "d" : "-");
+        fprintf(outFile, (flags & XkbLC_Partial) ? "p" : "-");
+        fprintf(outFile, "----- ");
+        if (map->type == XkmSymbolsIndex)
+        {
+            fprintf(outFile, (flags & XkbLC_AlphanumericKeys) ? "a" : "-");
+            fprintf(outFile, (flags & XkbLC_ModifierKeys) ? "m" : "-");
+            fprintf(outFile, (flags & XkbLC_KeypadKeys) ? "k" : "-");
+            fprintf(outFile, (flags & XkbLC_FunctionKeys) ? "f" : "-");
+            fprintf(outFile, (flags & XkbLC_AlternateGroup) ? "g" : "-");
+            fprintf(outFile, "--- ");
+        }
+        else
+            fprintf(outFile, "-------- ");
+    }
+    mapName = map->name;
+    if ((!(verboseLevel & WantFullNames)) && ((flags & XkbLC_Default) != 0))
+        mapName = NULL;
+    if (dirsToStrip > 0)
+    {
+        char *tmp, *last;
+        int i;
+        for (i = 0, tmp = last = fileName; (i < dirsToStrip) && tmp; i++)
+        {
+            last = tmp;
+            tmp = strchr(tmp, '/');
+            if (tmp != NULL)
+                tmp++;
+        }
+        fileName = (tmp ? tmp : last);
+    }
+    if (mapName)
+        fprintf(outFile, "%s(%s)\n", fileName, mapName);
+    else
+        fprintf(outFile, "%s\n", fileName);
+    return;
+}
+
+/***====================================================================***/
+
+static int
+AddDirectory(char *head, char *ptrn, char *rest, char *map)
+{
+#ifdef WIN32
+    HANDLE dirh;
+    WIN32_FIND_DATA file;
+#else
+    DIR *dirp;
+    struct dirent *file;
+#endif
+    int nMatch;
+
+    if (map == NULL)
+    {
+        char *tmp = ptrn;
+        if ((rest == NULL) && (ptrn != NULL) && (strchr(ptrn, '/') == NULL))
+        {
+            tmp = ptrn;
+            map = strchr(ptrn, '(');
+        }
+        else if ((rest == NULL) && (ptrn == NULL) &&
+                 (head != NULL) && (strchr(head, '/') == NULL))
+        {
+            tmp = head;
+            map = strchr(head, '(');
+        }
+        if (map != NULL)
+        {
+            tmp = strchr(tmp, ')');
+            if ((tmp == NULL) || (tmp[1] != '\0'))
+            {
+                ERROR1("File and map must have the format file(map)\n");
+                return 0;
+            }
+            *map = '\0';
+            map++;
+            *tmp = '\0';
+        }
+    }
+#ifdef WIN32
+    if ((dirh = FindFirstFile("*.*", &file)) == INVALID_HANDLE_VALUE)
+        return 0;
+#else
+    if ((dirp = opendir((head ? head : "."))) == NULL)
+        return 0;
+    nMatch = 0;
+#endif
+#ifdef WIN32
+    do
+#else
+    while ((file = readdir(dirp)) != NULL)
+#endif
+    {
+        char *tmp, *filename;
+        struct stat sbuf;
+
+        filename = FileName(file);
+        if (!filename || filename[0] == '.')
+            continue;
+        if (ptrn && (!XkbNameMatchesPattern(filename, ptrn)))
+            continue;
+        tmp =
+            (char *) uAlloc((head ? strlen(head) : 0) + strlen(filename) + 2);
+        if (!tmp)
+            continue;
+        sprintf(tmp, "%s%s%s", (head ? head : ""), (head ? "/" : ""),
+                filename);
+        if (stat(tmp, &sbuf) < 0)
+        {
+            uFree(tmp);
+            continue;
+        }
+        if (((rest != NULL) && (!S_ISDIR(sbuf.st_mode))) ||
+            ((map != NULL) && (S_ISDIR(sbuf.st_mode))))
+        {
+            uFree(tmp);
+            continue;
+        }
+        if (S_ISDIR(sbuf.st_mode))
+        {
+            if ((rest != NULL) || (verboseLevel & ListRecursive))
+                nMatch += AddDirectory(tmp, rest, NULL, map);
+        }
+        else
+            nMatch += AddListing(tmp, map);
+    }
+#ifdef WIN32
+    while (FindNextFile(dirh, &file));
+#endif
+    return nMatch;
+}
+
+/***====================================================================***/
+
+Bool
+AddMatchingFiles(char *head_in)
+{
+    char *str, *head, *ptrn, *rest = NULL;
+
+    if (head_in == NULL)
+        return 0;
+    ptrn = NULL;
+    for (str = head_in; (*str != '\0') && (*str != '?') && (*str != '*');
+         str++)
+    {
+        if ((str != head_in) && (*str == '/'))
+            ptrn = str;
+    }
+    if (*str == '\0')
+    {                           /* no wildcards */
+        head = head_in;
+        ptrn = NULL;
+        rest = NULL;
+    }
+    else if (ptrn == NULL)
+    {                           /* no slash before the first wildcard */
+        head = NULL;
+        ptrn = head_in;
+    }
+    else
+    {                           /* slash followed by wildcard */
+        head = head_in;
+        *ptrn = '\0';
+        ptrn++;
+    }
+    if (ptrn)
+    {
+        rest = strchr(ptrn, '/');
+        if (rest != NULL)
+        {
+            *rest = '\0';
+            rest++;
+        }
+    }
+    if (((rest && ptrn)
+         && ((strchr(ptrn, '(') != NULL) || (strchr(ptrn, ')') != NULL)))
+        || (head
+            && ((strchr(head, '(') != NULL) || (strchr(head, ')') != NULL))))
+    {
+        ERROR1("Files/maps to list must have the form file(map)\n");
+        ACTION("Illegal specifier ignored\n");
+        return 0;
+    }
+    return AddDirectory(head, ptrn, rest, NULL);
+}
+
+/***====================================================================***/
+
+static Bool
+MapMatches(char *mapToConsider, char *ptrn)
+{
+    int i;
+
+    if (ptrn != NULL)
+        return XkbNameMatchesPattern(mapToConsider, ptrn);
+    if (nMapOnly < 1)
+        return True;
+    for (i = 0; i < nMapOnly; i++)
+    {
+        if (XkbNameMatchesPattern(mapToConsider, mapOnly[i]))
+            return True;
+    }
+    return False;
+}
+
+int
+GenerateListing(char *out_name)
+{
+    int i;
+    FILE *inputFile, *outFile;
+    XkbFile *rtrn, *mapToUse;
+    unsigned oldWarningLevel;
+    char *mapName;
+
+    if (nFilesListed < 1)
+    {
+        ERROR1("Must specify at least one file or pattern to list\n");
+        return 0;
+    }
+    if ((!out_name) || ((out_name[0] == '-') && (out_name[1] == '\0')))
+        outFile = stdout;
+    else if ((outFile = fopen(out_name, "w")) == NULL)
+    {
+        ERROR1("Cannot open \"%s\" to write keyboard description\n",
+               out_name);
+        ACTION("Exiting\n");
+        return 0;
+    }
+#ifdef DEBUG
+    if (warningLevel > 9)
+        fprintf(stderr, "should list:\n");
+#endif
+    for (i = 0; i < nListed; i++)
+    {
+#ifdef DEBUG
+        if (warningLevel > 9)
+        {
+            fprintf(stderr, "%s(%s)\n",
+                    (list[i].file ? list[i].file : "*"),
+                    (list[i].map ? list[i].map : "*"));
+        }
+#endif
+        oldWarningLevel = warningLevel;
+        warningLevel = 0;
+        if (list[i].file)
+        {
+            struct stat sbuf;
+
+            if (stat(list[i].file, &sbuf) < 0)
+            {
+                if (oldWarningLevel > 5)
+                    WARN1("Couldn't open \"%s\"\n", list[i].file);
+                continue;
+            }
+            if (S_ISDIR(sbuf.st_mode))
+            {
+                if (verboseLevel & ListRecursive)
+                    AddDirectory(list[i].file, NULL, NULL, NULL);
+                continue;
+            }
+
+            inputFile = fopen(list[i].file, "r");
+            if (!inputFile)
+            {
+                if (oldWarningLevel > 5)
+                    WARN1("Couldn't open \"%s\"\n", list[i].file);
+                continue;
+            }
+            setScanState(list[i].file, 1);
+            if (XKBParseFile(inputFile, &rtrn) && (rtrn != NULL))
+            {
+                mapName = list[i].map;
+                mapToUse = rtrn;
+                for (; mapToUse; mapToUse = (XkbFile *) mapToUse->common.next)
+                {
+                    if (!MapMatches(mapToUse->name, mapName))
+                        continue;
+                    ListFile(outFile, list[i].file, mapToUse);
+                }
+            }
+            fclose(inputFile);
+        }
+        warningLevel = oldWarningLevel;
+    }
+    return 1;
+}
diff --git a/man/Makefile.am b/man/Makefile.am
new file mode 100644 (file)
index 0000000..f17336a
--- /dev/null
@@ -0,0 +1,12 @@
+
+appmandir = $(APP_MAN_DIR)
+appman_PRE = xkbcomp.man
+appman_DATA = $(appman_PRE:man=$(APP_MAN_SUFFIX))
+
+EXTRA_DIST = $(appman_PRE)
+CLEANFILES = $(appman_DATA)
+SUFFIXES = .$(APP_MAN_SUFFIX) .man
+
+# String replacements in MAN_SUBSTS now come from xorg-macros.m4 via configure
+.man.$(APP_MAN_SUFFIX):
+       $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@
diff --git a/man/Makefile.in b/man/Makefile.in
new file mode 100644 (file)
index 0000000..fa08ee5
--- /dev/null
@@ -0,0 +1,419 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = man
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(appmandir)"
+DATA = $(appman_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ADMIN_MAN_DIR = @ADMIN_MAN_DIR@
+ADMIN_MAN_SUFFIX = @ADMIN_MAN_SUFFIX@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APP_MAN_DIR = @APP_MAN_DIR@
+APP_MAN_SUFFIX = @APP_MAN_SUFFIX@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BASE_CFLAGS = @BASE_CFLAGS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHANGELOG_CMD = @CHANGELOG_CMD@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CWARNFLAGS = @CWARNFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DRIVER_MAN_DIR = @DRIVER_MAN_DIR@
+DRIVER_MAN_SUFFIX = @DRIVER_MAN_SUFFIX@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FILE_MAN_DIR = @FILE_MAN_DIR@
+FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_CMD = @INSTALL_CMD@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIB_MAN_DIR = @LIB_MAN_DIR@
+LIB_MAN_SUFFIX = @LIB_MAN_SUFFIX@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MAN_SUBSTS = @MAN_SUBSTS@
+MISC_MAN_DIR = @MISC_MAN_DIR@
+MISC_MAN_SUFFIX = @MISC_MAN_SUFFIX@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+REQUIRED_MODULES = @REQUIRED_MODULES@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRICT_CFLAGS = @STRICT_CFLAGS@
+STRIP = @STRIP@
+VERSION = @VERSION@
+XKBCOMP_CFLAGS = @XKBCOMP_CFLAGS@
+XKBCOMP_LIBS = @XKBCOMP_LIBS@
+XKBCONFIGROOT = @XKBCONFIGROOT@
+XORG_MAN_PAGE = @XORG_MAN_PAGE@
+YACC = @YACC@
+YACC_INST = @YACC_INST@
+YFLAGS = @YFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+appmandir = $(APP_MAN_DIR)
+appman_PRE = xkbcomp.man
+appman_DATA = $(appman_PRE:man=$(APP_MAN_SUFFIX))
+EXTRA_DIST = $(appman_PRE)
+CLEANFILES = $(appman_DATA)
+SUFFIXES = .$(APP_MAN_SUFFIX) .man
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .$(APP_MAN_SUFFIX) .man
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign man/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign man/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-appmanDATA: $(appman_DATA)
+       @$(NORMAL_INSTALL)
+       test -z "$(appmandir)" || $(MKDIR_P) "$(DESTDIR)$(appmandir)"
+       @list='$(appman_DATA)'; test -n "$(appmandir)" || list=; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(appmandir)'"; \
+         $(INSTALL_DATA) $$files "$(DESTDIR)$(appmandir)" || exit $$?; \
+       done
+
+uninstall-appmanDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(appman_DATA)'; test -n "$(appmandir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       test -n "$$files" || exit 0; \
+       echo " ( cd '$(DESTDIR)$(appmandir)' && rm -f" $$files ")"; \
+       cd "$(DESTDIR)$(appmandir)" && rm -f $$files
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+       for dir in "$(DESTDIR)$(appmandir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-appmanDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-appmanDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+       distclean-generic distdir dvi dvi-am html html-am info info-am \
+       install install-am install-appmanDATA install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+       pdf-am ps ps-am uninstall uninstall-am uninstall-appmanDATA
+
+
+# String replacements in MAN_SUBSTS now come from xorg-macros.m4 via configure
+.man.$(APP_MAN_SUFFIX):
+       $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/man/xkbcomp.man b/man/xkbcomp.man
new file mode 100644 (file)
index 0000000..0486b7d
--- /dev/null
@@ -0,0 +1,110 @@
+.\"
+.TH XKBCOMP 1 __xorgversion__
+.SH NAME
+xkbcomp \- compile XKB keyboard description
+.SH SYNOPSIS
+.B xkbcomp
+[option] source [ destination ]
+.SH DESCRIPTION
+.PP
+The
+.I xkbcomp
+keymap compiler converts a description of an XKB keymap into one of several
+output formats.   The most common use for xkbcomp is to create a compiled
+keymap file (.xkm extension) which can be read directly by XKB-capable X
+servers or utilities.   The keymap compiler can also produce C header
+files or XKB source files.  The C header files produced by xkbcomp can be
+included by X servers or utilities that need a built-in default keymap.
+The XKB source files produced by \fIxkbcomp\fP are fully resolved and can be
+used to verify that the files which typically make up an XKB keymap
+are merged correctly or to create a single file which contains a complete
+description of the keymap.
+.PP
+The \fIsource\fP may specify an X display, or an \fI.xkb\fP or \fI.xkm\fP
+file;  unless explicitly specified, the format of \fIdestination\fP
+depends on the format of the source.   Compiling a \fI.xkb\fP (keymap source)
+file generates a \fI.xkm\fP (compiled keymap file) by default.   If the
+source is a \fI.xkm\fP file or an X display, \fIxkbcomp\fP generates a
+keymap source file by default.
+.PP
+If the \fIdestination\fP is an X display, the keymap for the display
+is updated with the compiled keymap.
+.PP
+The name of the \fIdestination\fP is usually computed from the name
+of the source, with the extension replaced as appropriate.  When compiling
+a single map from a file which contains several maps, \fIxkbcomp\fP constructs
+the destination file name by appending an appropriate extension to the
+name of the map to be used.
+.SH OPTIONS
+.TP 8
+.B \-a
+Show all keyboard information, reporting implicit or derived information
+as a comment.  Only affects \fI.xkb\fP format output.
+.TP 8
+.B \-C
+Produce a C header file as output (.h extension).
+.TP 8
+.B \-dflts
+Compute defaults for any missing components, such as key names.
+.TP 8
+.B \-I\fIdir\fP
+Specifies top-level directories to be searched for files included by the
+keymap description.  After all directories specified by \-I options
+have been searched, the current directory and finally, the default
+xkb directory (usually __projectroot__/lib/X11/xkb) will be searched.
+.sp
+To prevent the current and default directories from being searched,
+use the \-I option alone (i.e. without a directory), before any \-I
+options that specify the directories you do want searched.
+.TP 8
+.B \-i\ \fIdeviceid\fP
+If \fIsource\fP or \fIdestination\fP is a valid X display, load the keymap
+from/into the device with the specified ID (not name).
+.TP 8
+.B \-l
+List maps that specify the \fImap\fP pattern in any files listed on the
+command line (not implemented yet).
+.TP 8
+.B \-m\ \fIname\fP
+Specifies a map to be compiled from an file with multiple entries.
+.TP 8
+.B \-merge
+Merge the compiled information with the map from the server (not implemented
+yet).
+.TP 8
+.B \-o\ \fIname\fP
+Specifies a name for the generated output file.  The default is the name of
+the source file with an appropriate extension for the output format.
+.TP 8
+.B \-opt\ \fIparts\fP
+Specifies a list of optional parts.  Compilation errors in any optional parts
+are not fatal.  Parts may consist of any combination of the letters \fIc\fP,
+\fIg\fP,\fIk\fP,\fIs\fP,\fIt\fP which specify the compatibility map, geometry,
+keycodes, symbols and types, respectively.
+.TP 8
+.B -R\fIdir\fP
+Specifies the root directory for relative path names.
+.TP 8
+.B -synch
+Force synchronization for X requests.
+.TP 8
+.B -version
+Print version number.
+.TP 8
+.B \-w\ \fIlvl\fP
+Controls the reporting of warnings during compilation.  A warning level
+of 0 disables all warnings; a warning level of 10 enables them all.
+.TP 8
+.B \-xkb
+Generate a source description of the keyboard as output (.xkb extension).
+.TP 8
+.B \-xkm
+Generate a compiled keymap file as output (.xkm extension).
+.SH "SEE ALSO"
+X(__miscmansuffix__)
+.SH COPYRIGHT
+Copyright 1994, Silicon Graphics Computer Systems and X Consortium, Inc.
+.br
+See \fIX(__miscmansuffix__)\fP for a full statement of rights and permissions.
+.SH AUTHOR
+Erik Fortune, Silicon Graphics
diff --git a/misc.c b/misc.c
new file mode 100644 (file)
index 0000000..4990a74
--- /dev/null
+++ b/misc.c
@@ -0,0 +1,581 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 "xkbcomp.h"
+#include "xkbpath.h"
+#include "tokens.h"
+#include "keycodes.h"
+#include "misc.h"
+#include <X11/keysym.h>
+#include "parseutils.h"
+
+#include <X11/extensions/XKBgeom.h>
+
+/***====================================================================***/
+
+/**
+ * Open the file given in the include statement and parse it's content.
+ * If the statement defines a specific map to use, this map is returned in
+ * file_rtrn. Otherwise, the default map is returned.
+ *
+ * @param stmt The include statement, specifying the file name to look for.
+ * @param file_type Type of file (XkmKeyNamesIdx, etc.)
+ * @param file_rtrn Returns the key map to be used.
+ * @param merge_rtrn Always returns stmt->merge.
+ *
+ * @return True on success or False otherwise.
+ */
+Bool
+ProcessIncludeFile(IncludeStmt * stmt,
+                   unsigned file_type,
+                   XkbFile ** file_rtrn, unsigned *merge_rtrn)
+{
+    FILE *file;
+    XkbFile *rtrn, *mapToUse;
+    char oldFile[1024] = {0};
+    int oldLine = lineNum;
+
+    rtrn = XkbFindFileInCache(stmt->file, file_type, &stmt->path);
+    if (rtrn == NULL)
+    {
+        /* file not in cache, open it, parse it and store it in cache for next
+           time. */
+        file = XkbFindFileInPath(stmt->file, file_type, &stmt->path);
+        if (file == NULL)
+        {
+            ERROR2("Can't find file \"%s\" for %s include\n", stmt->file,
+                   XkbDirectoryForInclude(file_type));
+            ACTION("Exiting\n");
+            return False;
+        }
+        strcpy(oldFile, scanFile);
+        oldLine = lineNum;
+        setScanState(stmt->file, 1);
+        if (debugFlags & 2)
+            INFO1("About to parse include file %s\n", stmt->file);
+        /* parse the file */
+        if ((XKBParseFile(file, &rtrn) == 0) || (rtrn == NULL))
+        {
+            setScanState(oldFile, oldLine);
+            ERROR1("Error interpreting include file \"%s\"\n", stmt->file);
+            ACTION("Exiting\n");
+            fclose(file);
+            return False;
+        }
+        fclose(file);
+        XkbAddFileToCache(stmt->file, file_type, stmt->path, rtrn);
+    }
+    mapToUse = rtrn;
+    if (stmt->map != NULL)
+    {
+        while ((mapToUse) && ((!uStringEqual(mapToUse->name, stmt->map)) ||
+                              (mapToUse->type != file_type)))
+        {
+            mapToUse = (XkbFile *) mapToUse->common.next;
+        }
+        if (!mapToUse)
+        {
+            ERROR3("No %s named \"%s\" in the include file \"%s\"\n",
+                   XkbConfigText(file_type, XkbMessage), stmt->map,
+                   stmt->file);
+            ACTION("Exiting\n");
+            return False;
+        }
+    }
+    else if ((rtrn->common.next != NULL) && (warningLevel > 5))
+    {
+        WARN1("No map in include statement, but \"%s\" contains several\n",
+              stmt->file);
+        ACTION1("Using first defined map, \"%s\"\n", rtrn->name);
+    }
+    setScanState(oldFile, oldLine);
+    if (mapToUse->type != file_type)
+    {
+        ERROR2("Include file wrong type (expected %s, got %s)\n",
+               XkbConfigText(file_type, XkbMessage),
+               XkbConfigText(mapToUse->type, XkbMessage));
+        ACTION1("Include file \"%s\" ignored\n", stmt->file);
+        return False;
+    }
+    /* FIXME: we have to check recursive includes here (or somewhere) */
+
+    mapToUse->compiled = True;
+    *file_rtrn = mapToUse;
+    *merge_rtrn = stmt->merge;
+    return True;
+}
+
+/***====================================================================***/
+
+int
+ReportNotArray(const char *type, const char *field, const char *name)
+{
+    ERROR2("The %s %s field is not an array\n", type, field);
+    ACTION1("Ignoring illegal assignment in %s\n", name);
+    return False;
+}
+
+int
+ReportShouldBeArray(const char *type, const char *field, char *name)
+{
+    ERROR2("Missing subscript for %s %s\n", type, field);
+    ACTION1("Ignoring illegal assignment in %s\n", name);
+    return False;
+}
+
+int
+ReportBadType(const char *type, const char *field,
+              const char *name, const char *wanted)
+{
+    ERROR3("The %s %s field must be a %s\n", type, field, wanted);
+    ACTION1("Ignoring illegal assignment in %s\n", name);
+    return False;
+}
+
+int
+ReportBadIndexType(char *type, char *field, char *name, char *wanted)
+{
+    ERROR3("Index for the %s %s field must be a %s\n", type, field, wanted);
+    ACTION1("Ignoring assignment to illegal field in %s\n", name);
+    return False;
+}
+
+int
+ReportBadField(const char *type, const char *field, const char *name)
+{
+    ERROR3("Unknown %s field %s in %s\n", type, field, name);
+    ACTION1("Ignoring assignment to unknown field in %s\n", name);
+    return False;
+}
+
+int
+ReportMultipleDefs(char *type, char *field, char *name)
+{
+    WARN3("Multiple definitions of %s in %s \"%s\"\n", field, type, name);
+    ACTION("Using last definition\n");
+    return False;
+}
+
+/***====================================================================***/
+
+Bool
+UseNewField(unsigned field,
+            CommonInfo * oldDefs, CommonInfo * newDefs, unsigned *pCollide)
+{
+    Bool useNew;
+
+    useNew = False;
+    if (oldDefs->defined & field)
+    {
+        if (newDefs->defined & field)
+        {
+            if (((oldDefs->fileID == newDefs->fileID)
+                 && (warningLevel > 0)) || (warningLevel > 9))
+            {
+                *pCollide |= field;
+            }
+            if (newDefs->merge != MergeAugment)
+                useNew = True;
+        }
+    }
+    else if (newDefs->defined & field)
+        useNew = True;
+    return useNew;
+}
+
+Bool
+MergeNewField(unsigned field,
+              CommonInfo * oldDefs, CommonInfo * newDefs, unsigned *pCollide)
+{
+    if ((oldDefs->defined & field) && (newDefs->defined & field))
+    {
+        if (((oldDefs->fileID == newDefs->fileID) && (warningLevel > 0)) ||
+            (warningLevel > 9))
+        {
+            *pCollide |= field;
+        }
+        if (newDefs->merge == MergeAugment)
+            return True;
+    }
+    return False;
+}
+
+XPointer
+ClearCommonInfo(CommonInfo * cmn)
+{
+    if (cmn != NULL)
+    {
+        CommonInfo *this, *next;
+        for (this = cmn; this != NULL; this = next)
+        {
+            next = this->next;
+            uFree(this);
+        }
+    }
+    return NULL;
+}
+
+XPointer
+AddCommonInfo(CommonInfo * old, CommonInfo * new)
+{
+    CommonInfo *first;
+
+    first = old;
+    while (old && old->next)
+    {
+        old = old->next;
+    }
+    new->next = NULL;
+    if (old)
+    {
+        old->next = new;
+        return (XPointer) first;
+    }
+    return (XPointer) new;
+}
+
+/***====================================================================***/
+
+typedef struct _KeyNameDesc
+{
+    KeySym level1;
+    KeySym level2;
+    char name[5];
+    Bool used;
+} KeyNameDesc;
+
+static KeyNameDesc dfltKeys[] = {
+    {XK_Escape, NoSymbol, "ESC\0"},
+    {XK_quoteleft, XK_asciitilde, "TLDE"},
+    {XK_1, XK_exclam, "AE01"},
+    {XK_2, XK_at, "AE02"},
+    {XK_3, XK_numbersign, "AE03"},
+    {XK_4, XK_dollar, "AE04"},
+    {XK_5, XK_percent, "AE05"},
+    {XK_6, XK_asciicircum, "AE06"},
+    {XK_7, XK_ampersand, "AE07"},
+    {XK_8, XK_asterisk, "AE08"},
+    {XK_9, XK_parenleft, "AE09"},
+    {XK_0, XK_parenright, "AE10"},
+    {XK_minus, XK_underscore, "AE11"},
+    {XK_equal, XK_plus, "AE12"},
+    {XK_BackSpace, NoSymbol, "BKSP"},
+    {XK_Tab, NoSymbol, "TAB\0"},
+    {XK_q, XK_Q, "AD01"},
+    {XK_w, XK_W, "AD02"},
+    {XK_e, XK_E, "AD03"},
+    {XK_r, XK_R, "AD04"},
+    {XK_t, XK_T, "AD05"},
+    {XK_y, XK_Y, "AD06"},
+    {XK_u, XK_U, "AD07"},
+    {XK_i, XK_I, "AD08"},
+    {XK_o, XK_O, "AD09"},
+    {XK_p, XK_P, "AD10"},
+    {XK_bracketleft, XK_braceleft, "AD11"},
+    {XK_bracketright, XK_braceright, "AD12"},
+    {XK_Return, NoSymbol, "RTRN"},
+    {XK_Caps_Lock, NoSymbol, "CAPS"},
+    {XK_a, XK_A, "AC01"},
+    {XK_s, XK_S, "AC02"},
+    {XK_d, XK_D, "AC03"},
+    {XK_f, XK_F, "AC04"},
+    {XK_g, XK_G, "AC05"},
+    {XK_h, XK_H, "AC06"},
+    {XK_j, XK_J, "AC07"},
+    {XK_k, XK_K, "AC08"},
+    {XK_l, XK_L, "AC09"},
+    {XK_semicolon, XK_colon, "AC10"},
+    {XK_quoteright, XK_quotedbl, "AC11"},
+    {XK_Shift_L, NoSymbol, "LFSH"},
+    {XK_z, XK_Z, "AB01"},
+    {XK_x, XK_X, "AB02"},
+    {XK_c, XK_C, "AB03"},
+    {XK_v, XK_V, "AB04"},
+    {XK_b, XK_B, "AB05"},
+    {XK_n, XK_N, "AB06"},
+    {XK_m, XK_M, "AB07"},
+    {XK_comma, XK_less, "AB08"},
+    {XK_period, XK_greater, "AB09"},
+    {XK_slash, XK_question, "AB10"},
+    {XK_backslash, XK_bar, "BKSL"},
+    {XK_Control_L, NoSymbol, "LCTL"},
+    {XK_space, NoSymbol, "SPCE"},
+    {XK_Shift_R, NoSymbol, "RTSH"},
+    {XK_Alt_L, NoSymbol, "LALT"},
+    {XK_space, NoSymbol, "SPCE"},
+    {XK_Control_R, NoSymbol, "RCTL"},
+    {XK_Alt_R, NoSymbol, "RALT"},
+    {XK_F1, NoSymbol, "FK01"},
+    {XK_F2, NoSymbol, "FK02"},
+    {XK_F3, NoSymbol, "FK03"},
+    {XK_F4, NoSymbol, "FK04"},
+    {XK_F5, NoSymbol, "FK05"},
+    {XK_F6, NoSymbol, "FK06"},
+    {XK_F7, NoSymbol, "FK07"},
+    {XK_F8, NoSymbol, "FK08"},
+    {XK_F9, NoSymbol, "FK09"},
+    {XK_F10, NoSymbol, "FK10"},
+    {XK_F11, NoSymbol, "FK11"},
+    {XK_F12, NoSymbol, "FK12"},
+    {XK_Print, NoSymbol, "PRSC"},
+    {XK_Scroll_Lock, NoSymbol, "SCLK"},
+    {XK_Pause, NoSymbol, "PAUS"},
+    {XK_Insert, NoSymbol, "INS\0"},
+    {XK_Home, NoSymbol, "HOME"},
+    {XK_Prior, NoSymbol, "PGUP"},
+    {XK_Delete, NoSymbol, "DELE"},
+    {XK_End, NoSymbol, "END"},
+    {XK_Next, NoSymbol, "PGDN"},
+    {XK_Up, NoSymbol, "UP\0\0"},
+    {XK_Left, NoSymbol, "LEFT"},
+    {XK_Down, NoSymbol, "DOWN"},
+    {XK_Right, NoSymbol, "RGHT"},
+    {XK_Num_Lock, NoSymbol, "NMLK"},
+    {XK_KP_Divide, NoSymbol, "KPDV"},
+    {XK_KP_Multiply, NoSymbol, "KPMU"},
+    {XK_KP_Subtract, NoSymbol, "KPSU"},
+    {NoSymbol, XK_KP_7, "KP7\0"},
+    {NoSymbol, XK_KP_8, "KP8\0"},
+    {NoSymbol, XK_KP_9, "KP9\0"},
+    {XK_KP_Add, NoSymbol, "KPAD"},
+    {NoSymbol, XK_KP_4, "KP4\0"},
+    {NoSymbol, XK_KP_5, "KP5\0"},
+    {NoSymbol, XK_KP_6, "KP6\0"},
+    {NoSymbol, XK_KP_1, "KP1\0"},
+    {NoSymbol, XK_KP_2, "KP2\0"},
+    {NoSymbol, XK_KP_3, "KP3\0"},
+    {XK_KP_Enter, NoSymbol, "KPEN"},
+    {NoSymbol, XK_KP_0, "KP0\0"},
+    {XK_KP_Delete, NoSymbol, "KPDL"},
+    {XK_less, XK_greater, "LSGT"},
+    {XK_KP_Separator, NoSymbol, "KPCO"},
+    {XK_Find, NoSymbol, "FIND"},
+    {NoSymbol, NoSymbol, "\0\0\0\0"}
+};
+
+Status
+ComputeKbdDefaults(XkbDescPtr xkb)
+{
+    Status rtrn;
+    register int i, tmp, nUnknown;
+    KeyNameDesc *name;
+    KeySym *syms;
+    char tmpname[XkbKeyNameLength + 1];
+
+    if ((xkb->names == NULL) || (xkb->names->keys == NULL))
+    {
+        if ((rtrn = XkbAllocNames(xkb, XkbKeyNamesMask, 0, 0)) != Success)
+            return rtrn;
+    }
+    for (name = dfltKeys; (name->name[0] != '\0'); name++)
+    {
+        name->used = False;
+    }
+    nUnknown = 0;
+    for (i = xkb->min_key_code; i <= xkb->max_key_code; i++)
+    {
+        tmp = XkbKeyNumSyms(xkb, i);
+        if ((xkb->names->keys[i].name[0] == '\0') && (tmp > 0))
+        {
+            tmp = XkbKeyGroupsWidth(xkb, i);
+            syms = XkbKeySymsPtr(xkb, i);
+            for (name = dfltKeys; (name->name[0] != '\0'); name++)
+            {
+                Bool match = True;
+                if (((name->level1 != syms[0])
+                     && (name->level1 != NoSymbol))
+                    || ((name->level2 != NoSymbol) && (tmp < 2))
+                    || ((name->level2 != syms[1])
+                        && (name->level2 != NoSymbol)))
+                {
+                    match = False;
+                }
+                if (match)
+                {
+                    if (!name->used)
+                    {
+                        memcpy(xkb->names->keys[i].name, name->name,
+                               XkbKeyNameLength);
+                        name->used = True;
+                    }
+                    else
+                    {
+                        if (warningLevel > 2)
+                        {
+                            WARN1
+                                ("Several keys match pattern for %s\n",
+                                 XkbKeyNameText(name->name, XkbMessage));
+                            ACTION2("Using <U%03d> for key %d\n",
+                                    nUnknown, i);
+                        }
+                        snprintf(tmpname, sizeof(tmpname), "U%03d",
+                                 nUnknown++);
+                        memcpy(xkb->names->keys[i].name, tmpname,
+                               XkbKeyNameLength);
+                    }
+                    break;
+                }
+            }
+            if (xkb->names->keys[i].name[0] == '\0')
+            {
+                if (warningLevel > 2)
+                {
+                    WARN1("Key %d does not match any defaults\n", i);
+                    ACTION1("Using name <U%03d>\n", nUnknown);
+                    snprintf(tmpname, sizeof(tmpname), "U%03d", nUnknown++);
+                    memcpy(xkb->names->keys[i].name, tmpname,
+                           XkbKeyNameLength);
+                }
+            }
+        }
+    }
+    return Success;
+}
+
+/**
+ * Find the key with the given name and return its keycode in kc_rtrn.
+ *
+ * @param name The 4-letter name of the key as a long.
+ * @param kc_rtrn Set to the keycode if the key was found, otherwise 0.
+ * @param use_aliases True if the key aliases should be searched too.
+ * @param create If True and the key is not found, it is added to the
+ *        xkb->names at the first free keycode.
+ * @param start_from Keycode to start searching from.
+ *
+ * @return True if found, False otherwise.
+ */
+Bool
+FindNamedKey(XkbDescPtr xkb,
+             unsigned long name,
+             unsigned int *kc_rtrn,
+             Bool use_aliases, Bool create, int start_from)
+{
+    register unsigned n;
+
+    if (start_from < xkb->min_key_code)
+    {
+        start_from = xkb->min_key_code;
+    }
+    else if (start_from > xkb->max_key_code)
+    {
+        return False;
+    }
+
+    *kc_rtrn = 0;               /* some callers rely on this */
+    if (xkb && xkb->names && xkb->names->keys)
+    {
+        for (n = start_from; n <= xkb->max_key_code; n++)
+        {
+            unsigned long tmp;
+            tmp = KeyNameToLong(xkb->names->keys[n].name);
+            if (tmp == name)
+            {
+                *kc_rtrn = n;
+                return True;
+            }
+        }
+        if (use_aliases)
+        {
+            unsigned long new_name;
+            if (FindKeyNameForAlias(xkb, name, &new_name))
+                return FindNamedKey(xkb, new_name, kc_rtrn, False, create, 0);
+        }
+    }
+    if (create)
+    {
+        if ((!xkb->names) || (!xkb->names->keys))
+        {
+            if (xkb->min_key_code < XkbMinLegalKeyCode)
+            {
+                xkb->min_key_code = XkbMinLegalKeyCode;
+                xkb->max_key_code = XkbMaxLegalKeyCode;
+            }
+            if (XkbAllocNames(xkb, XkbKeyNamesMask, 0, 0) != Success)
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("Couldn't allocate key names in FindNamedKey\n");
+                    ACTION1("Key \"%s\" not automatically created\n",
+                            longText(name, XkbMessage));
+                }
+                return False;
+            }
+        }
+        /* Find first unused keycode and store our key here */
+        for (n = xkb->min_key_code; n <= xkb->max_key_code; n++)
+        {
+            if (xkb->names->keys[n].name[0] == '\0')
+            {
+                char buf[XkbKeyNameLength + 1];
+                LongToKeyName(name, buf);
+                memcpy(xkb->names->keys[n].name, buf, XkbKeyNameLength);
+                *kc_rtrn = n;
+                return True;
+            }
+        }
+    }
+    return False;
+}
+
+Bool
+FindKeyNameForAlias(XkbDescPtr xkb, unsigned long lname,
+                    unsigned long *real_name)
+{
+    register int i;
+    char name[XkbKeyNameLength + 1];
+
+    if (xkb && xkb->geom && xkb->geom->key_aliases)
+    {
+        XkbKeyAliasPtr a;
+        a = xkb->geom->key_aliases;
+        LongToKeyName(lname, name);
+        name[XkbKeyNameLength] = '\0';
+        for (i = 0; i < xkb->geom->num_key_aliases; i++, a++)
+        {
+            if (strncmp(name, a->alias, XkbKeyNameLength) == 0)
+            {
+                *real_name = KeyNameToLong(a->real);
+                return True;
+            }
+        }
+    }
+    if (xkb && xkb->names && xkb->names->key_aliases)
+    {
+        XkbKeyAliasPtr a;
+        a = xkb->names->key_aliases;
+        LongToKeyName(lname, name);
+        name[XkbKeyNameLength] = '\0';
+        for (i = 0; i < xkb->names->num_key_aliases; i++, a++)
+        {
+            if (strncmp(name, a->alias, XkbKeyNameLength) == 0)
+            {
+                *real_name = KeyNameToLong(a->real);
+                return True;
+            }
+        }
+    }
+    return False;
+}
diff --git a/misc.h b/misc.h
new file mode 100644 (file)
index 0000000..4fa4b6d
--- /dev/null
+++ b/misc.h
@@ -0,0 +1,111 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 MISC_H
+#define MISC_H 1
+
+typedef struct _CommonInfo
+{
+    unsigned short defined;
+    unsigned char fileID;
+    unsigned char merge;
+    struct _CommonInfo *next;
+} CommonInfo;
+
+extern Bool UseNewField(unsigned /* field */ ,
+                        CommonInfo * /* oldDefs */ ,
+                        CommonInfo * /* newDefs */ ,
+                        unsigned *      /* pCollide */
+    );
+
+extern Bool MergeNewField(unsigned /* field */ ,
+                          CommonInfo * /* oldDefs */ ,
+                          CommonInfo * /* newDefs */ ,
+                          unsigned *    /* pCollide */
+    );
+
+extern XPointer ClearCommonInfo(CommonInfo *    /* cmn */
+    );
+
+extern XPointer AddCommonInfo(CommonInfo * /* old */ ,
+                              CommonInfo *      /* new */
+    );
+
+extern int ReportNotArray(const char * /* type */ ,
+                          const char * /* field */ ,
+                          const char *  /* name */
+    );
+
+extern int ReportShouldBeArray(const char * /* type */ ,
+                               const char * /* field */ ,
+                               char *   /* name */
+    );
+
+extern int ReportBadType(const char * /* type */ ,
+                         const char * /* field */ ,
+                         const char * /* name */ ,
+                         const char *   /* wanted */
+    );
+
+extern int ReportBadIndexType(char * /* type */ ,
+                              char * /* field */ ,
+                              char * /* name */ ,
+                              char *    /* wanted */
+    );
+
+extern int ReportBadField(const char * /* type */ ,
+                          const char * /* field */ ,
+                          const char *  /* name */
+    );
+
+extern int ReportMultipleDefs(char * /* type */ ,
+                              char * /* field */ ,
+                              char *    /* which */
+    );
+
+extern Bool ProcessIncludeFile(IncludeStmt * /* stmt */ ,
+                               unsigned /* file_type */ ,
+                               XkbFile ** /* file_rtrn */ ,
+                               unsigned *       /* merge_rtrn */
+    );
+
+extern Status ComputeKbdDefaults(XkbDescPtr     /* xkb */
+    );
+
+extern Bool FindNamedKey(XkbDescPtr /* xkb */ ,
+                         unsigned long /* name */ ,
+                         unsigned int * /* kc_rtrn */ ,
+                         Bool /* use_aliases */ ,
+                         Bool /* create */ ,
+                         int    /* start_from */
+    );
+
+extern Bool FindKeyNameForAlias(XkbDescPtr /* xkb */ ,
+                                unsigned long /* lname */ ,
+                                unsigned long * /* real_name */
+    );
+
+#endif /* MISC_H */
diff --git a/missing b/missing
new file mode 100755 (executable)
index 0000000..28055d2
--- /dev/null
+++ b/missing
@@ -0,0 +1,376 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# normalize program name to check for.
+program=`echo "$1" | sed '
+  s/^gnu-//; t
+  s/^gnu//; t
+  s/^g//; t'`
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).  This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+  lex*|yacc*)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  tar*)
+    if test -n "$run"; then
+       echo 1>&2 "ERROR: \`tar' requires --run"
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       exit 1
+    fi
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $program in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case $f in
+      *:*) touch_files="$touch_files "`echo "$f" |
+                                      sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+          sed 's/\.am$/.in/' |
+          while read f; do touch "$f"; done
+    ;;
+
+  autom4te*)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+       touch $file
+    else
+       test -z "$file" || exec >$file
+       echo "#! /bin/sh"
+       echo "# Created by GNU Automake missing as a replacement of"
+       echo "#  $ $@"
+       echo "exit 0"
+       chmod +x $file
+       exit 1
+    fi
+    ;;
+
+  bison*|yacc*)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+       case $LASTARG in
+       *.y)
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+           if test -f "$SRCFILE"; then
+                cp "$SRCFILE" y.tab.c
+           fi
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+           if test -f "$SRCFILE"; then
+                cp "$SRCFILE" y.tab.h
+           fi
+         ;;
+       esac
+    fi
+    if test ! -f y.tab.h; then
+       echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+       echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex*|flex*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+       case $LASTARG in
+       *.l)
+           SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+           if test -f "$SRCFILE"; then
+                cp "$SRCFILE" lex.yy.c
+           fi
+         ;;
+       esac
+    fi
+    if test ! -f lex.yy.c; then
+       echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+        you modified a dependency of a manual page.  You may need the
+        \`Help2man' package in order for those modifications to take
+        effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+       touch $file
+    else
+       test -z "$file" || exec >$file
+       echo ".ab help2man is required to generate this page"
+       exit $?
+    fi
+    ;;
+
+  makeinfo*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+       /^@setfilename/{
+         s/.* \([^ ]*\) *$/\1/
+         p
+         q
+       }' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  tar*)
+    shift
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+       case $firstarg in
+       *o*)
+           firstarg=`echo "$firstarg" | sed s/o//`
+           tar "$firstarg" "$@" && exit 0
+           ;;
+       esac
+       case $firstarg in
+       *h*)
+           firstarg=`echo "$firstarg" | sed s/h//`
+           tar "$firstarg" "$@" && exit 0
+           ;;
+       esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/parseutils.c b/parseutils.c
new file mode 100644 (file)
index 0000000..253cd9d
--- /dev/null
@@ -0,0 +1,847 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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.
+
+ ********************************************************/
+
+#define        DEBUG_VAR parseDebug
+#include "parseutils.h"
+#include "xkbpath.h"
+#include <X11/keysym.h>
+#include <X11/extensions/XKBgeom.h>
+#include <X11/Xalloca.h>
+#include <limits.h>
+#include <stdlib.h>
+
+XkbFile *rtrnValue;
+
+ParseCommon *
+AppendStmt(ParseCommon * to, ParseCommon * append)
+{
+    ParseCommon *start = to;
+
+    if (append == NULL)
+        return to;
+    while ((to != NULL) && (to->next != NULL))
+    {
+        to = to->next;
+    }
+    if (to)
+    {
+        to->next = append;
+        return start;
+    }
+    return append;
+}
+
+ExprDef *
+ExprCreate(unsigned op, unsigned type)
+{
+    ExprDef *expr;
+    expr = uTypedAlloc(ExprDef);
+    if (expr)
+    {
+        expr->common.stmtType = StmtExpr;
+        expr->common.next = NULL;
+        expr->op = op;
+        expr->type = type;
+    }
+    else
+    {
+        FATAL("Couldn't allocate expression in parser\n");
+        /* NOTREACHED */
+    }
+    return expr;
+}
+
+ExprDef *
+ExprCreateUnary(unsigned op, unsigned type, ExprDef * child)
+{
+    ExprDef *expr;
+    expr = uTypedAlloc(ExprDef);
+    if (expr)
+    {
+        expr->common.stmtType = StmtExpr;
+        expr->common.next = NULL;
+        expr->op = op;
+        expr->type = type;
+        expr->value.child = child;
+    }
+    else
+    {
+        FATAL("Couldn't allocate expression in parser\n");
+        /* NOTREACHED */
+    }
+    return expr;
+}
+
+ExprDef *
+ExprCreateBinary(unsigned op, ExprDef * left, ExprDef * right)
+{
+    ExprDef *expr;
+    expr = uTypedAlloc(ExprDef);
+    if (expr)
+    {
+        expr->common.stmtType = StmtExpr;
+        expr->common.next = NULL;
+        expr->op = op;
+        if ((op == OpAssign) || (left->type == TypeUnknown))
+            expr->type = right->type;
+        else if ((left->type == right->type) || (right->type == TypeUnknown))
+            expr->type = left->type;
+        else
+            expr->type = TypeUnknown;
+        expr->value.binary.left = left;
+        expr->value.binary.right = right;
+    }
+    else
+    {
+        FATAL("Couldn't allocate expression in parser\n");
+        /* NOTREACHED */
+    }
+    return expr;
+}
+
+KeycodeDef *
+KeycodeCreate(char *name, ExprDef * value)
+{
+    KeycodeDef *def;
+
+    def = uTypedAlloc(KeycodeDef);
+    if (def)
+    {
+        def->common.stmtType = StmtKeycodeDef;
+        def->common.next = NULL;
+        strncpy(def->name, name, XkbKeyNameLength);
+        def->name[XkbKeyNameLength] = '\0';
+        def->value = value;
+    }
+    else
+    {
+        FATAL("Couldn't allocate key name definition in parser\n");
+        /* NOTREACHED */
+    }
+    return def;
+}
+
+KeyAliasDef *
+KeyAliasCreate(char *alias, char *real)
+{
+    KeyAliasDef *def;
+
+    def = uTypedAlloc(KeyAliasDef);
+    if (def)
+    {
+        def->common.stmtType = StmtKeyAliasDef;
+        def->common.next = NULL;
+        strncpy(def->alias, alias, XkbKeyNameLength);
+        def->alias[XkbKeyNameLength] = '\0';
+        strncpy(def->real, real, XkbKeyNameLength);
+        def->real[XkbKeyNameLength] = '\0';
+    }
+    else
+    {
+        FATAL("Couldn't allocate key alias definition in parser\n");
+        /* NOTREACHED */
+    }
+    return def;
+}
+
+VModDef *
+VModCreate(Atom name, ExprDef * value)
+{
+    VModDef *def;
+    def = uTypedAlloc(VModDef);
+    if (def)
+    {
+        def->common.stmtType = StmtVModDef;
+        def->common.next = NULL;
+        def->name = name;
+        def->value = value;
+    }
+    else
+    {
+        FATAL("Couldn't allocate variable definition in parser\n");
+        /* NOTREACHED */
+    }
+    return def;
+}
+
+VarDef *
+VarCreate(ExprDef * name, ExprDef * value)
+{
+    VarDef *def;
+    def = uTypedAlloc(VarDef);
+    if (def)
+    {
+        def->common.stmtType = StmtVarDef;
+        def->common.next = NULL;
+        def->name = name;
+        def->value = value;
+    }
+    else
+    {
+        FATAL("Couldn't allocate variable definition in parser\n");
+        /* NOTREACHED */
+    }
+    return def;
+}
+
+VarDef *
+BoolVarCreate(Atom nameToken, unsigned set)
+{
+    ExprDef *name, *value;
+
+    name = ExprCreate(ExprIdent, TypeUnknown);
+    name->value.str = nameToken;
+    value = ExprCreate(ExprValue, TypeBoolean);
+    value->value.uval = set;
+    return VarCreate(name, value);
+}
+
+InterpDef *
+InterpCreate(const char *sym_str, ExprDef * match)
+{
+    InterpDef *def;
+
+    def = uTypedAlloc(InterpDef);
+    if (def)
+    {
+        def->common.stmtType = StmtInterpDef;
+        def->common.next = NULL;
+        if (LookupKeysym(sym_str, &def->sym) == 0)
+            def->ignore = True;
+        else
+            def->ignore = False;
+        def->match = match;
+    }
+    else
+    {
+        FATAL("Couldn't allocate interp definition in parser\n");
+        /* NOTREACHED */
+    }
+    return def;
+}
+
+KeyTypeDef *
+KeyTypeCreate(Atom name, VarDef * body)
+{
+    KeyTypeDef *def;
+
+    def = uTypedAlloc(KeyTypeDef);
+    if (def)
+    {
+        def->common.stmtType = StmtKeyTypeDef;
+        def->common.next = NULL;
+        def->merge = MergeDefault;
+        def->name = name;
+        def->body = body;
+    }
+    else
+    {
+        FATAL("Couldn't allocate key type definition in parser\n");
+        /* NOTREACHED */
+    }
+    return def;
+}
+
+SymbolsDef *
+SymbolsCreate(char *keyName, ExprDef * symbols)
+{
+    SymbolsDef *def;
+
+    def = uTypedAlloc(SymbolsDef);
+    if (def)
+    {
+        def->common.stmtType = StmtSymbolsDef;
+        def->common.next = NULL;
+        def->merge = MergeDefault;
+        bzero(def->keyName, 5);
+        strncpy(def->keyName, keyName, 4);
+        def->symbols = symbols;
+    }
+    else
+    {
+        FATAL("Couldn't allocate symbols definition in parser\n");
+        /* NOTREACHED */
+    }
+    return def;
+}
+
+GroupCompatDef *
+GroupCompatCreate(int group, ExprDef * val)
+{
+    GroupCompatDef *def;
+
+    def = uTypedAlloc(GroupCompatDef);
+    if (def)
+    {
+        def->common.stmtType = StmtGroupCompatDef;
+        def->common.next = NULL;
+        def->merge = MergeDefault;
+        def->group = group;
+        def->def = val;
+    }
+    else
+    {
+        FATAL("Couldn't allocate group compat definition in parser\n");
+        /* NOTREACHED */
+    }
+    return def;
+}
+
+ModMapDef *
+ModMapCreate(Atom modifier, ExprDef * keys)
+{
+    ModMapDef *def;
+
+    def = uTypedAlloc(ModMapDef);
+    if (def)
+    {
+        def->common.stmtType = StmtModMapDef;
+        def->common.next = NULL;
+        def->merge = MergeDefault;
+        def->modifier = modifier;
+        def->keys = keys;
+    }
+    else
+    {
+        FATAL("Couldn't allocate mod mask definition in parser\n");
+        /* NOTREACHED */
+    }
+    return def;
+}
+
+IndicatorMapDef *
+IndicatorMapCreate(Atom name, VarDef * body)
+{
+    IndicatorMapDef *def;
+
+    def = uTypedAlloc(IndicatorMapDef);
+    if (def)
+    {
+        def->common.stmtType = StmtIndicatorMapDef;
+        def->common.next = NULL;
+        def->merge = MergeDefault;
+        def->name = name;
+        def->body = body;
+    }
+    else
+    {
+        FATAL("Couldn't allocate indicator map definition in parser\n");
+        /* NOTREACHED */
+    }
+    return def;
+}
+
+IndicatorNameDef *
+IndicatorNameCreate(int ndx, ExprDef * name, Bool virtual)
+{
+    IndicatorNameDef *def;
+
+    def = uTypedAlloc(IndicatorNameDef);
+    if (def)
+    {
+        def->common.stmtType = StmtIndicatorNameDef;
+        def->common.next = NULL;
+        def->merge = MergeDefault;
+        def->ndx = ndx;
+        def->name = name;
+        def->virtual = virtual;
+    }
+    else
+    {
+        FATAL("Couldn't allocate indicator index definition in parser\n");
+        /* NOTREACHED */
+    }
+    return def;
+}
+
+ExprDef *
+ActionCreate(Atom name, ExprDef * args)
+{
+    ExprDef *act;
+
+    act = uTypedAlloc(ExprDef);
+    if (act)
+    {
+        act->common.stmtType = StmtExpr;
+        act->common.next = NULL;
+        act->op = ExprActionDecl;
+        act->value.action.name = name;
+        act->value.action.args = args;
+        return act;
+    }
+    FATAL("Couldn't allocate ActionDef in parser\n");
+    return NULL;
+}
+
+ExprDef *
+CreateKeysymList(char *sym)
+{
+    ExprDef *def;
+
+    def = ExprCreate(ExprKeysymList, TypeSymbols);
+    if (def)
+    {
+        def->value.list.nSyms = 1;
+        def->value.list.szSyms = 4;
+        def->value.list.syms = uTypedCalloc(4, char *);
+        if (def->value.list.syms != NULL)
+        {
+            def->value.list.syms[0] = sym;
+            return def;
+        }
+    }
+    FATAL("Couldn't allocate expression for keysym list in parser\n");
+    return NULL;
+}
+
+ShapeDef *
+ShapeDeclCreate(Atom name, OutlineDef * outlines)
+{
+    ShapeDef *shape;
+    OutlineDef *ol;
+
+    shape = uTypedAlloc(ShapeDef);
+    if (shape != NULL)
+    {
+        bzero(shape, sizeof(ShapeDef));
+        shape->common.stmtType = StmtShapeDef;
+        shape->common.next = NULL;
+        shape->merge = MergeDefault;
+        shape->name = name;
+        shape->nOutlines = 0;
+        shape->outlines = outlines;
+        for (ol = outlines; ol != NULL; ol = (OutlineDef *) ol->common.next)
+        {
+            if (ol->nPoints > 0)
+                shape->nOutlines++;
+        }
+    }
+    return shape;
+}
+
+OutlineDef *
+OutlineCreate(Atom field, ExprDef * points)
+{
+    OutlineDef *outline;
+    ExprDef *pt;
+
+    outline = uTypedAlloc(OutlineDef);
+    if (outline != NULL)
+    {
+        bzero(outline, sizeof(OutlineDef));
+        outline->common.stmtType = StmtOutlineDef;
+        outline->common.next = NULL;
+        outline->field = field;
+        outline->nPoints = 0;
+        if (points->op == ExprCoord)
+        {
+            for (pt = points; pt != NULL; pt = (ExprDef *) pt->common.next)
+            {
+                outline->nPoints++;
+            }
+        }
+        outline->points = points;
+    }
+    return outline;
+}
+
+KeyDef *
+KeyDeclCreate(char *name, ExprDef * expr)
+{
+    KeyDef *key;
+
+    key = uTypedAlloc(KeyDef);
+    if (key != NULL)
+    {
+        bzero(key, sizeof(KeyDef));
+        key->common.stmtType = StmtKeyDef;
+        key->common.next = NULL;
+        if (name)
+            key->name = name;
+        else
+            key->expr = expr;
+    }
+    return key;
+}
+
+KeyDef *
+KeyDeclMerge(KeyDef * into, KeyDef * from)
+{
+    into->expr =
+        (ExprDef *) AppendStmt(&into->expr->common, &from->expr->common);
+    from->expr = NULL;
+    uFree(from);
+    return into;
+}
+
+RowDef *
+RowDeclCreate(KeyDef * keys)
+{
+    RowDef *row;
+    KeyDef *key;
+
+    row = uTypedAlloc(RowDef);
+    if (row != NULL)
+    {
+        bzero(row, sizeof(RowDef));
+        row->common.stmtType = StmtRowDef;
+        row->common.next = NULL;
+        row->nKeys = 0;
+        row->keys = keys;
+        for (key = keys; key != NULL; key = (KeyDef *) key->common.next)
+        {
+            if (key->common.stmtType == StmtKeyDef)
+                row->nKeys++;
+        }
+    }
+    return row;
+}
+
+SectionDef *
+SectionDeclCreate(Atom name, RowDef * rows)
+{
+    SectionDef *section;
+    RowDef *row;
+
+    section = uTypedAlloc(SectionDef);
+    if (section != NULL)
+    {
+        bzero(section, sizeof(SectionDef));
+        section->common.stmtType = StmtSectionDef;
+        section->common.next = NULL;
+        section->name = name;
+        section->nRows = 0;
+        section->rows = rows;
+        for (row = rows; row != NULL; row = (RowDef *) row->common.next)
+        {
+            if (row->common.stmtType == StmtRowDef)
+                section->nRows++;
+        }
+    }
+    return section;
+}
+
+OverlayKeyDef *
+OverlayKeyCreate(char *under, char *over)
+{
+    OverlayKeyDef *key;
+
+    key = uTypedAlloc(OverlayKeyDef);
+    if (key != NULL)
+    {
+        bzero(key, sizeof(OverlayKeyDef));
+        key->common.stmtType = StmtOverlayKeyDef;
+        strncpy(key->over, over, XkbKeyNameLength);
+        strncpy(key->under, under, XkbKeyNameLength);
+        if (over)
+            uFree(over);
+        if (under)
+            uFree(under);
+    }
+    return key;
+}
+
+OverlayDef *
+OverlayDeclCreate(Atom name, OverlayKeyDef * keys)
+{
+    OverlayDef *ol;
+    OverlayKeyDef *key;
+
+    ol = uTypedAlloc(OverlayDef);
+    if (ol != NULL)
+    {
+        bzero(ol, sizeof(OverlayDef));
+        ol->common.stmtType = StmtOverlayDef;
+        ol->name = name;
+        ol->keys = keys;
+        for (key = keys; key != NULL;
+             key = (OverlayKeyDef *) key->common.next)
+        {
+            ol->nKeys++;
+        }
+    }
+    return ol;
+}
+
+DoodadDef *
+DoodadCreate(unsigned type, Atom name, VarDef * body)
+{
+    DoodadDef *doodad;
+
+    doodad = uTypedAlloc(DoodadDef);
+    if (doodad != NULL)
+    {
+        bzero(doodad, sizeof(DoodadDef));
+        doodad->common.stmtType = StmtDoodadDef;
+        doodad->common.next = NULL;
+        doodad->type = type;
+        doodad->name = name;
+        doodad->body = body;
+    }
+    return doodad;
+}
+
+ExprDef *
+AppendKeysymList(ExprDef * list, char *sym)
+{
+    if (list->value.list.nSyms >= list->value.list.szSyms)
+    {
+        list->value.list.szSyms *= 2;
+        list->value.list.syms = uTypedRecalloc(list->value.list.syms,
+                                               list->value.list.nSyms,
+                                               list->value.list.szSyms,
+                                               char *);
+        if (list->value.list.syms == NULL)
+        {
+            FATAL("Couldn't resize list of symbols for append\n");
+            return NULL;
+        }
+    }
+    list->value.list.syms[list->value.list.nSyms++] = sym;
+    return list;
+}
+
+int
+LookupKeysym(const char *str, KeySym * sym_rtrn)
+{
+    KeySym sym;
+    char *tmp;
+
+    if ((!str) || (uStrCaseCmp(str, "any") == 0)
+        || (uStrCaseCmp(str, "nosymbol") == 0))
+    {
+        *sym_rtrn = NoSymbol;
+        return 1;
+    }
+    else if ((uStrCaseCmp(str, "none") == 0)
+             || (uStrCaseCmp(str, "voidsymbol") == 0))
+    {
+        *sym_rtrn = XK_VoidSymbol;
+        return 1;
+    }
+    sym = XStringToKeysym(str);
+    if (sym != NoSymbol)
+    {
+        *sym_rtrn = sym;
+        return 1;
+    }
+    if (strlen(str) > 2 && str[0] == '0' && str[1] == 'x') {
+        sym = strtoul(str, &tmp, 16);
+        if (sym != ULONG_MAX && (!tmp || *tmp == '\0')) {
+            *sym_rtrn = sym;
+            return 1;
+        }
+    }
+    return 0;
+}
+
+IncludeStmt *
+IncludeCreate(char *str, unsigned merge)
+{
+    IncludeStmt *incl, *first;
+    char *file, *map, *stmt, *tmp, *extra_data;
+    char nextop;
+    Bool haveSelf;
+
+    haveSelf = False;
+    incl = first = NULL;
+    file = map = NULL;
+    tmp = str;
+    stmt = uStringDup(str);
+    while ((tmp) && (*tmp))
+    {
+        if (XkbParseIncludeMap(&tmp, &file, &map, &nextop, &extra_data))
+        {
+            if ((file == NULL) && (map == NULL))
+            {
+                if (haveSelf)
+                    goto BAIL;
+                haveSelf = True;
+            }
+            if (first == NULL)
+                first = incl = uTypedAlloc(IncludeStmt);
+            else
+            {
+                incl->next = uTypedAlloc(IncludeStmt);
+                incl = incl->next;
+            }
+            if (incl)
+            {
+                incl->common.stmtType = StmtInclude;
+                incl->common.next = NULL;
+                incl->merge = merge;
+                incl->stmt = NULL;
+                incl->file = file;
+                incl->map = map;
+                incl->modifier = extra_data;
+                incl->path = NULL;
+                incl->next = NULL;
+            }
+            else
+            {
+                WSGO("Allocation failure in IncludeCreate\n");
+                ACTION("Using only part of the include\n");
+                break;
+            }
+            if (nextop == '|')
+                merge = MergeAugment;
+            else
+                merge = MergeOverride;
+        }
+        else
+        {
+            goto BAIL;
+        }
+    }
+    if (first)
+        first->stmt = stmt;
+    else if (stmt)
+        uFree(stmt);
+    return first;
+  BAIL:
+    ERROR1("Illegal include statement \"%s\"\n", stmt);
+    ACTION("Ignored\n");
+    while (first)
+    {
+        incl = first->next;
+        if (first->file)
+            uFree(first->file);
+        if (first->map)
+            uFree(first->map);
+        if (first->modifier)
+            uFree(first->modifier);
+        if (first->path)
+            uFree(first->path);
+        first->file = first->map = first->path = NULL;
+        uFree(first);
+        first = incl;
+    }
+    if (stmt)
+        uFree(stmt);
+    return NULL;
+}
+
+#ifdef DEBUG
+void
+PrintStmtAddrs(ParseCommon * stmt)
+{
+    fprintf(stderr, "%p", stmt);
+    if (stmt)
+    {
+        do
+        {
+            fprintf(stderr, "->%p", stmt->next);
+            stmt = stmt->next;
+        }
+        while (stmt);
+    }
+    fprintf(stderr, "\n");
+}
+#endif
+
+static void
+CheckDefaultMap(XkbFile * maps)
+{
+    XkbFile *dflt, *tmp;
+
+    dflt = NULL;
+    for (tmp = maps, dflt = NULL; tmp != NULL;
+         tmp = (XkbFile *) tmp->common.next)
+    {
+        if (tmp->flags & XkbLC_Default)
+        {
+            if (dflt == NULL)
+                dflt = tmp;
+            else
+            {
+                if (warningLevel > 2)
+                {
+                    WARN1("Multiple default components in %s\n",
+                          (scanFile ? scanFile : "(unknown)"));
+                    ACTION2("Using %s, ignoring %s\n",
+                            (dflt->name ? dflt->name : "(first)"),
+                            (tmp->name ? tmp->name : "(subsequent)"));
+                }
+                tmp->flags &= (~XkbLC_Default);
+            }
+        }
+    }
+    return;
+}
+
+int
+XKBParseFile(FILE * file, XkbFile ** pRtrn)
+{
+    if (file)
+    {
+        yyin = file;
+        rtrnValue = NULL;
+        if (yyparse() == 0)
+        {
+            *pRtrn = rtrnValue;
+            CheckDefaultMap(rtrnValue);
+            rtrnValue = NULL;
+            return 1;
+        }
+        *pRtrn = NULL;
+        return 0;
+    }
+    *pRtrn = NULL;
+    return 1;
+}
+
+XkbFile *
+CreateXKBFile(int type, char *name, ParseCommon * defs, unsigned flags)
+{
+    XkbFile *file;
+    static int fileID;
+
+    file = uTypedAlloc(XkbFile);
+    if (file)
+    {
+        XkbEnsureSafeMapName(name);
+        bzero(file, sizeof(XkbFile));
+        file->type = type;
+        file->topName = uStringDup(name);
+        file->name = name;
+        file->defs = defs;
+        file->id = fileID++;
+        file->compiled = False;
+        file->flags = flags;
+    }
+    return file;
+}
+
+unsigned
+StmtSetMerge(ParseCommon * stmt, unsigned merge)
+{
+    if ((merge == MergeAltForm) && (stmt->stmtType != StmtKeycodeDef))
+    {
+        yyerror("illegal use of 'alternate' merge mode");
+        merge = MergeDefault;
+    }
+    return merge;
+}
diff --git a/parseutils.h b/parseutils.h
new file mode 100644 (file)
index 0000000..8b8a6c1
--- /dev/null
@@ -0,0 +1,208 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 XKBPARSE_H
+#define        XKBPARSE_H 1
+
+#ifndef DEBUG_VAR
+#define        DEBUG_VAR       parseDebug
+#endif
+
+#include "xkbcomp.h"
+
+extern char scanBuf[1024];
+extern int scanInt;
+extern int lineNum;
+
+extern XkbFile *rtrnValue;
+
+#ifdef DEBUG
+#define        d(str)          fprintf(stderr,"%s\n",str);
+#define d1(str,a)      fprintf(stderr,str,a);
+#define d2(str,a,b)    fprintf(stderr,str,a,b);
+#else
+#define        d(str)
+#define        d1(str,a)
+#define d2(str,a,b)
+#endif
+
+
+extern ParseCommon *AppendStmt(ParseCommon * /* to */ ,
+                               ParseCommon *    /* append */
+    );
+
+extern ExprDef *ExprCreate(unsigned /* op */ ,
+                           unsigned     /* type */
+    );
+
+extern ExprDef *ExprCreateUnary(unsigned /* op */ ,
+                                unsigned /* type */ ,
+                                ExprDef *       /* child */
+    );
+
+extern ExprDef *ExprCreateBinary(unsigned /* op */ ,
+                                 ExprDef * /* left */ ,
+                                 ExprDef *      /* right */
+    );
+
+extern KeycodeDef *KeycodeCreate(char * /* name */ ,
+                                 ExprDef *      /* value */
+    );
+
+extern KeyAliasDef *KeyAliasCreate(char * /* alias */ ,
+                                   char *       /* real */
+    );
+
+extern VModDef *VModCreate(Atom /* name */ ,
+                           ExprDef *    /* value */
+    );
+
+extern VarDef *VarCreate(ExprDef * /* name */ ,
+                         ExprDef *      /* value */
+    );
+
+extern VarDef *BoolVarCreate(Atom /* nameToken */ ,
+                             unsigned   /* set */
+    );
+
+extern InterpDef *InterpCreate(const char * /* sym_str */ ,
+                               ExprDef *        /* match */
+    );
+
+extern KeyTypeDef *KeyTypeCreate(Atom /* name */ ,
+                                 VarDef *       /* body */
+    );
+
+extern SymbolsDef *SymbolsCreate(char * /* keyName */ ,
+                                 ExprDef *      /* symbols */
+    );
+
+extern GroupCompatDef *GroupCompatCreate(int /* group */ ,
+                                         ExprDef *      /* def */
+    );
+
+extern ModMapDef *ModMapCreate(Atom /* modifier */ ,
+                               ExprDef *        /* keys */
+    );
+
+extern IndicatorMapDef *IndicatorMapCreate(Atom /* name */ ,
+                                           VarDef *     /* body */
+    );
+
+extern IndicatorNameDef *IndicatorNameCreate(int /* ndx */ ,
+                                             ExprDef * /* name */ ,
+                                             Bool       /* virtual */
+    );
+
+extern ExprDef *ActionCreate(Atom /* name */ ,
+                             ExprDef *  /* args */
+    );
+
+extern ExprDef *CreateKeysymList(char * /* sym */
+    );
+
+extern ShapeDef *ShapeDeclCreate(Atom /* name */ ,
+                                 OutlineDef *   /* outlines */
+    );
+
+extern OutlineDef *OutlineCreate(Atom /* field */ ,
+                                 ExprDef *      /* points */
+    );
+
+extern KeyDef *KeyDeclCreate(char * /* name */ ,
+                             ExprDef *  /* expr */
+    );
+
+extern KeyDef *KeyDeclMerge(KeyDef * /* into */ ,
+                            KeyDef *    /* from */
+    );
+
+extern RowDef *RowDeclCreate(KeyDef *   /* keys */
+    );
+
+extern SectionDef *SectionDeclCreate(Atom /* name */ ,
+                                     RowDef *   /* rows */
+    );
+
+extern OverlayKeyDef *OverlayKeyCreate(char * /* under */ ,
+                                       char *   /* over  */
+    );
+
+extern OverlayDef *OverlayDeclCreate(Atom /* name */ ,
+                                     OverlayKeyDef *    /* rows */
+    );
+
+extern DoodadDef *DoodadCreate(unsigned /* type */ ,
+                               Atom /* name */ ,
+                               VarDef * /* body */
+    );
+
+extern ExprDef *AppendKeysymList(ExprDef * /* list */ ,
+                                 char * /* sym */
+    );
+
+extern int LookupKeysym(const char * /* str */ ,
+                        KeySym *        /* sym_rtrn */
+    );
+
+extern IncludeStmt *IncludeCreate(char * /* str */ ,
+                                  unsigned      /* merge */
+    );
+
+extern unsigned StmtSetMerge(ParseCommon * /* stmt */ ,
+                             unsigned   /* merge */
+    );
+
+#ifdef DEBUG
+extern void PrintStmtAddrs(ParseCommon *        /* stmt */
+    );
+#endif
+
+extern int XKBParseFile(FILE * /* file */ ,
+                        XkbFile **      /* pRtrn */
+    );
+
+extern XkbFile *CreateXKBFile(int /* type */ ,
+                              char * /* name */ ,
+                              ParseCommon * /* defs */ ,
+                              unsigned  /* flags */
+    );
+
+extern void yyerror(const char *        /* s */
+    );
+
+extern int yywrap(void);
+
+extern int yylex(void);
+extern int yyparse(void);
+
+extern int setScanState(char * /* file */ ,
+                        int     /* line */
+    );
+
+extern FILE *yyin;
+
+#endif /* XKBPARSE_H */
diff --git a/symbols.c b/symbols.c
new file mode 100644 (file)
index 0000000..5547999
--- /dev/null
+++ b/symbols.c
@@ -0,0 +1,2302 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 "xkbcomp.h"
+#include "tokens.h"
+#include "expr.h"
+#include "parseutils.h"
+
+#include <X11/keysym.h>
+#include <X11/Xutil.h>
+#include <stdlib.h>
+
+#include "expr.h"
+#include "vmod.h"
+#include "action.h"
+#include "keycodes.h"
+#include "misc.h"
+#include "alias.h"
+
+/***====================================================================***/
+
+#define        RepeatYes       1
+#define        RepeatNo        0
+#define        RepeatUndefined ~((unsigned)0)
+
+#define        _Key_Syms       (1<<0)
+#define        _Key_Acts       (1<<1)
+#define        _Key_Repeat     (1<<2)
+#define        _Key_Behavior   (1<<3)
+#define        _Key_Type_Dflt  (1<<4)
+#define        _Key_Types      (1<<5)
+#define        _Key_GroupInfo  (1<<6)
+#define        _Key_VModMap    (1<<7)
+
+typedef struct _KeyInfo
+{
+    CommonInfo defs;
+    unsigned long name; /* the 4 chars of the key name, as long */
+    unsigned char groupInfo;
+    unsigned char typesDefined;
+    unsigned char symsDefined;
+    unsigned char actsDefined;
+    short numLevels[XkbNumKbdGroups];
+    KeySym *syms[XkbNumKbdGroups];
+    XkbAction *acts[XkbNumKbdGroups];
+    Atom types[XkbNumKbdGroups];
+    unsigned repeat;
+    XkbBehavior behavior;
+    unsigned short vmodmap;
+    unsigned long nameForOverlayKey;
+    unsigned long allowNone;
+    Atom dfltType;
+} KeyInfo;
+
+/**
+ * Init the given key info to sane values.
+ */
+static void
+InitKeyInfo(KeyInfo * info)
+{
+    register int i;
+    static char dflt[4] = "*";
+
+    info->defs.defined = 0;
+    info->defs.fileID = 0;
+    info->defs.merge = MergeOverride;
+    info->defs.next = NULL;
+    info->name = KeyNameToLong(dflt);
+    info->groupInfo = 0;
+    info->typesDefined = info->symsDefined = info->actsDefined = 0;
+    for (i = 0; i < XkbNumKbdGroups; i++)
+    {
+        info->numLevels[i] = 0;
+        info->types[i] = None;
+        info->syms[i] = NULL;
+        info->acts[i] = NULL;
+    }
+    info->dfltType = None;
+    info->behavior.type = XkbKB_Default;
+    info->behavior.data = 0;
+    info->vmodmap = 0;
+    info->nameForOverlayKey = 0;
+    info->repeat = RepeatUndefined;
+    info->allowNone = 0;
+    return;
+}
+
+/**
+ * Free memory associated with this key info and reset to sane values.
+ */
+static void
+FreeKeyInfo(KeyInfo * info)
+{
+    register int i;
+
+    info->defs.defined = 0;
+    info->defs.fileID = 0;
+    info->defs.merge = MergeOverride;
+    info->defs.next = NULL;
+    info->groupInfo = 0;
+    info->typesDefined = info->symsDefined = info->actsDefined = 0;
+    for (i = 0; i < XkbNumKbdGroups; i++)
+    {
+        info->numLevels[i] = 0;
+        info->types[i] = None;
+        if (info->syms[i] != NULL)
+            uFree(info->syms[i]);
+        info->syms[i] = NULL;
+        if (info->acts[i] != NULL)
+            uFree(info->acts[i]);
+        info->acts[i] = NULL;
+    }
+    info->dfltType = None;
+    info->behavior.type = XkbKB_Default;
+    info->behavior.data = 0;
+    info->vmodmap = 0;
+    info->nameForOverlayKey = 0;
+    info->repeat = RepeatUndefined;
+    info->allowNone = 0;
+    return;
+}
+
+/**
+ * Copy old into new, optionally reset old to 0.
+ * If old is reset, new simply re-uses old's memory. Otherwise, the memory is
+ * newly allocated and new points to the new memory areas.
+ */
+static Bool
+CopyKeyInfo(KeyInfo * old, KeyInfo * new, Bool clearOld)
+{
+    register int i;
+
+    *new = *old;
+    new->defs.next = NULL;
+    if (clearOld)
+    {
+        for (i = 0; i < XkbNumKbdGroups; i++)
+        {
+            old->numLevels[i] = 0;
+            old->syms[i] = NULL;
+            old->acts[i] = NULL;
+        }
+    }
+    else
+    {
+        int width;
+        for (i = 0; i < XkbNumKbdGroups; i++)
+        {
+            width = new->numLevels[i];
+            if (old->syms[i] != NULL)
+            {
+                new->syms[i] = uTypedCalloc(width, KeySym);
+                if (!new->syms[i])
+                {
+                    new->syms[i] = NULL;
+                    new->numLevels[i] = 0;
+                    return False;
+                }
+                memcpy((char *) new->syms[i], (char *) old->syms[i],
+                       width * sizeof(KeySym));
+            }
+            if (old->acts[i] != NULL)
+            {
+                new->acts[i] = uTypedCalloc(width, XkbAction);
+                if (!new->acts[i])
+                {
+                    new->acts[i] = NULL;
+                    return False;
+                }
+                memcpy((char *) new->acts[i], (char *) old->acts[i],
+                       width * sizeof(XkbAction));
+            }
+        }
+    }
+    return True;
+}
+
+/***====================================================================***/
+
+typedef struct _ModMapEntry
+{
+    CommonInfo defs;
+    Bool haveSymbol;
+    int modifier;
+    union
+    {
+        unsigned long keyName;
+        KeySym keySym;
+    } u;
+} ModMapEntry;
+
+#define        SYMBOLS_INIT_SIZE       110
+#define        SYMBOLS_CHUNK           20
+typedef struct _SymbolsInfo
+{
+    char *name;         /* e.g. pc+us+inet(evdev) */
+    int errorCount;
+    unsigned fileID;
+    unsigned merge;
+    unsigned explicit_group;
+    unsigned groupInfo;
+    unsigned szKeys;
+    unsigned nKeys;
+    KeyInfo *keys;
+    KeyInfo dflt;
+    VModInfo vmods;
+    ActionInfo *action;
+    Atom groupNames[XkbNumKbdGroups];
+
+    ModMapEntry *modMap;
+    AliasInfo *aliases;
+} SymbolsInfo;
+
+static void
+InitSymbolsInfo(SymbolsInfo * info, XkbDescPtr xkb)
+{
+    register int i;
+
+    tok_ONE_LEVEL = XkbInternAtom(NULL, "ONE_LEVEL", False);
+    tok_TWO_LEVEL = XkbInternAtom(NULL, "TWO_LEVEL", False);
+    tok_KEYPAD = XkbInternAtom(NULL, "KEYPAD", False);
+    info->name = NULL;
+    info->explicit_group = 0;
+    info->errorCount = 0;
+    info->fileID = 0;
+    info->merge = MergeOverride;
+    info->groupInfo = 0;
+    info->szKeys = SYMBOLS_INIT_SIZE;
+    info->nKeys = 0;
+    info->keys = uTypedCalloc(SYMBOLS_INIT_SIZE, KeyInfo);
+    info->modMap = NULL;
+    for (i = 0; i < XkbNumKbdGroups; i++)
+        info->groupNames[i] = None;
+    InitKeyInfo(&info->dflt);
+    InitVModInfo(&info->vmods, xkb);
+    info->action = NULL;
+    info->aliases = NULL;
+    return;
+}
+
+static void
+FreeSymbolsInfo(SymbolsInfo * info)
+{
+    register int i;
+
+    if (info->name)
+        uFree(info->name);
+    info->name = NULL;
+    if (info->keys)
+    {
+        for (i = 0; i < info->nKeys; i++)
+        {
+            FreeKeyInfo(&info->keys[i]);
+        }
+        uFree(info->keys);
+        info->keys = NULL;
+    }
+    if (info->modMap)
+    {
+        ClearCommonInfo(&info->modMap->defs);
+        info->modMap = NULL;
+    }
+    if (info->aliases)
+    {
+        ClearAliases(&info->aliases);
+        info->aliases = NULL;
+    }
+    bzero((char *) info, sizeof(SymbolsInfo));
+    return;
+}
+
+static Bool
+ResizeKeyGroup(KeyInfo * key,
+               unsigned group, unsigned atLeastSize, Bool forceActions)
+{
+    Bool tooSmall;
+    unsigned newWidth;
+
+    tooSmall = (key->numLevels[group] < atLeastSize);
+    if (tooSmall)
+        newWidth = atLeastSize;
+    else
+        newWidth = key->numLevels[group];
+
+    if ((key->syms[group] == NULL) || tooSmall)
+    {
+        key->syms[group] = uTypedRecalloc(key->syms[group],
+                                          key->numLevels[group], newWidth,
+                                          KeySym);
+        if (!key->syms[group])
+            return False;
+    }
+    if (((forceActions) && (tooSmall || (key->acts[group] == NULL))) ||
+        (tooSmall && (key->acts[group] != NULL)))
+    {
+        key->acts[group] = uTypedRecalloc(key->acts[group],
+                                          key->numLevels[group], newWidth,
+                                          XkbAction);
+        if (!key->acts[group])
+            return False;
+    }
+    key->numLevels[group] = newWidth;
+    return True;
+}
+
+static Bool
+MergeKeyGroups(SymbolsInfo * info,
+               KeyInfo * into, KeyInfo * from, unsigned group)
+{
+    KeySym *resultSyms;
+    XkbAction *resultActs;
+    int resultWidth;
+    register int i;
+    Bool report, clobber;
+
+    clobber = (from->defs.merge != MergeAugment);
+    report = (warningLevel > 9) ||
+        ((into->defs.fileID == from->defs.fileID) && (warningLevel > 0));
+    if (into->numLevels[group] >= from->numLevels[group])
+    {
+        resultSyms = into->syms[group];
+        resultActs = into->acts[group];
+        resultWidth = into->numLevels[group];
+    }
+    else
+    {
+        resultSyms = from->syms[group];
+        resultActs = from->acts[group];
+        resultWidth = from->numLevels[group];
+    }
+    if (resultSyms == NULL)
+    {
+        resultSyms = uTypedCalloc(resultWidth, KeySym);
+        if (!resultSyms)
+        {
+            WSGO("Could not allocate symbols for group merge\n");
+            ACTION2("Group %d of key %s not merged\n", group,
+                    longText(into->name, XkbMessage));
+            return False;
+        }
+    }
+    if ((resultActs == NULL) && (into->acts[group] || from->acts[group]))
+    {
+        resultActs = uTypedCalloc(resultWidth, XkbAction);
+        if (!resultActs)
+        {
+            WSGO("Could not allocate actions for group merge\n");
+            ACTION2("Group %d of key %s not merged\n", group,
+                    longText(into->name, XkbMessage));
+            return False;
+        }
+    }
+    for (i = 0; i < resultWidth; i++)
+    {
+        KeySym fromSym, toSym;
+        if (from->syms[group] && (i < from->numLevels[group]))
+            fromSym = from->syms[group][i];
+        else
+            fromSym = NoSymbol;
+        if (into->syms[group] && (i < into->numLevels[group]))
+            toSym = into->syms[group][i];
+        else
+            toSym = NoSymbol;
+        if ((fromSym == NoSymbol) || (fromSym == toSym))
+            resultSyms[i] = toSym;
+        else if (toSym == NoSymbol)
+            resultSyms[i] = fromSym;
+        else
+        {
+            KeySym use, ignore;
+            if (clobber)
+            {
+                use = fromSym;
+                ignore = toSym;
+            }
+            else
+            {
+                use = toSym;
+                ignore = fromSym;
+            }
+            if (report)
+            {
+                WARN3
+                    ("Multiple symbols for level %d/group %d on key %s\n",
+                     i + 1, group + 1, longText(into->name, XkbMessage));
+                ACTION2("Using %s, ignoring %s\n",
+                        XkbKeysymText(use, XkbMessage),
+                        XkbKeysymText(ignore, XkbMessage));
+            }
+            resultSyms[i] = use;
+        }
+        if (resultActs != NULL)
+        {
+            XkbAction *fromAct, *toAct;
+            fromAct = (from->acts[group] ? &from->acts[group][i] : NULL);
+            toAct = (into->acts[group] ? &into->acts[group][i] : NULL);
+            if (((fromAct == NULL) || (fromAct->type == XkbSA_NoAction))
+                && (toAct != NULL))
+            {
+                resultActs[i] = *toAct;
+            }
+            else if (((toAct == NULL) || (toAct->type == XkbSA_NoAction))
+                     && (fromAct != NULL))
+            {
+                resultActs[i] = *fromAct;
+            }
+            else
+            {
+                XkbAction *use, *ignore;
+                if (clobber)
+                {
+                    use = fromAct;
+                    ignore = toAct;
+                }
+                else
+                {
+                    use = toAct;
+                    ignore = fromAct;
+                }
+                if (report)
+                {
+                    WARN3
+                        ("Multiple actions for level %d/group %d on key %s\n",
+                         i + 1, group + 1, longText(into->name, XkbMessage));
+                    ACTION2("Using %s, ignoring %s\n",
+                            XkbActionTypeText(use->type, XkbMessage),
+                            XkbActionTypeText(ignore->type, XkbMessage));
+                }
+                resultActs[i] = *use;
+            }
+        }
+    }
+    if ((into->syms[group] != NULL) && (resultSyms != into->syms[group]))
+        uFree(into->syms[group]);
+    if ((from->syms[group] != NULL) && (resultSyms != from->syms[group]))
+        uFree(from->syms[group]);
+    if ((into->acts[group] != NULL) && (resultActs != into->acts[group]))
+        uFree(into->acts[group]);
+    if ((from->acts[group] != NULL) && (resultActs != from->acts[group]))
+        uFree(from->acts[group]);
+    into->numLevels[group] = resultWidth;
+    into->syms[group] = resultSyms;
+    from->syms[group] = NULL;
+    into->acts[group] = resultActs;
+    from->acts[group] = NULL;
+    into->symsDefined |= (1 << group);
+    from->symsDefined &= ~(1 << group);
+    into->actsDefined |= (1 << group);
+    from->actsDefined &= ~(1 << group);
+    return True;
+}
+
+static Bool
+MergeKeys(SymbolsInfo * info, KeyInfo * into, KeyInfo * from)
+{
+    register int i;
+    unsigned collide = 0;
+    Bool report;
+
+    if (from->defs.merge == MergeReplace)
+    {
+        for (i = 0; i < XkbNumKbdGroups; i++)
+        {
+            if (into->numLevels[i] != 0)
+            {
+                if (into->syms[i])
+                    uFree(into->syms[i]);
+                if (into->acts[i])
+                    uFree(into->acts[i]);
+            }
+        }
+        *into = *from;
+        bzero(from, sizeof(KeyInfo));
+        return True;
+    }
+    report = ((warningLevel > 9) ||
+              ((into->defs.fileID == from->defs.fileID)
+               && (warningLevel > 0)));
+    for (i = 0; i < XkbNumKbdGroups; i++)
+    {
+        if (from->numLevels[i] > 0)
+        {
+            if (into->numLevels[i] == 0)
+            {
+                into->numLevels[i] = from->numLevels[i];
+                into->syms[i] = from->syms[i];
+                into->acts[i] = from->acts[i];
+                into->symsDefined |= (1 << i);
+                from->syms[i] = NULL;
+                from->acts[i] = NULL;
+                from->numLevels[i] = 0;
+                from->symsDefined &= ~(1 << i);
+                if (into->syms[i])
+                    into->defs.defined |= _Key_Syms;
+                if (into->acts[i])
+                    into->defs.defined |= _Key_Acts;
+            }
+            else
+            {
+                if (report)
+                {
+                    if (into->syms[i])
+                        collide |= _Key_Syms;
+                    if (into->acts[i])
+                        collide |= _Key_Acts;
+                }
+                MergeKeyGroups(info, into, from, (unsigned) i);
+            }
+        }
+        if (from->types[i] != None)
+        {
+            if ((into->types[i] != None) && (report) &&
+                (into->types[i] != from->types[i]))
+            {
+                Atom use, ignore;
+                collide |= _Key_Types;
+                if (from->defs.merge != MergeAugment)
+                {
+                    use = from->types[i];
+                    ignore = into->types[i];
+                }
+                else
+                {
+                    use = into->types[i];
+                    ignore = from->types[i];
+                }
+                WARN2
+                    ("Multiple definitions for group %d type of key %s\n",
+                     i, longText(into->name, XkbMessage));
+                ACTION2("Using %s, ignoring %s\n",
+                        XkbAtomText(NULL, use, XkbMessage),
+                        XkbAtomText(NULL, ignore, XkbMessage));
+            }
+            if ((from->defs.merge != MergeAugment)
+                || (into->types[i] == None))
+            {
+                into->types[i] = from->types[i];
+            }
+        }
+    }
+    if (UseNewField(_Key_Behavior, &into->defs, &from->defs, &collide))
+    {
+        into->behavior = from->behavior;
+        into->nameForOverlayKey = from->nameForOverlayKey;
+        into->defs.defined |= _Key_Behavior;
+    }
+    if (UseNewField(_Key_VModMap, &into->defs, &from->defs, &collide))
+    {
+        into->vmodmap = from->vmodmap;
+        into->defs.defined |= _Key_VModMap;
+    }
+    if (UseNewField(_Key_Repeat, &into->defs, &from->defs, &collide))
+    {
+        into->repeat = from->repeat;
+        into->defs.defined |= _Key_Repeat;
+    }
+    if (UseNewField(_Key_Type_Dflt, &into->defs, &from->defs, &collide))
+    {
+        into->dfltType = from->dfltType;
+        into->defs.defined |= _Key_Type_Dflt;
+    }
+    if (UseNewField(_Key_GroupInfo, &into->defs, &from->defs, &collide))
+    {
+        into->groupInfo = from->groupInfo;
+        into->defs.defined |= _Key_GroupInfo;
+    }
+    if (collide)
+    {
+        WARN1("Symbol map for key %s redefined\n",
+              longText(into->name, XkbMessage));
+        ACTION1("Using %s definition for conflicting fields\n",
+                (from->defs.merge == MergeAugment ? "first" : "last"));
+    }
+    return True;
+}
+
+static Bool
+AddKeySymbols(SymbolsInfo * info, KeyInfo * key, XkbDescPtr xkb)
+{
+    register int i;
+    unsigned long real_name;
+
+    for (i = 0; i < info->nKeys; i++)
+    {
+        if (info->keys[i].name == key->name)
+            return MergeKeys(info, &info->keys[i], key);
+    }
+    if (FindKeyNameForAlias(xkb, key->name, &real_name))
+    {
+        for (i = 0; i < info->nKeys; i++)
+        {
+            if (info->keys[i].name == real_name)
+                return MergeKeys(info, &info->keys[i], key);
+        }
+    }
+    if (info->nKeys >= info->szKeys)
+    {
+        info->szKeys += SYMBOLS_CHUNK;
+        info->keys =
+            uTypedRecalloc(info->keys, info->nKeys, info->szKeys, KeyInfo);
+        if (!info->keys)
+        {
+            WSGO("Could not allocate key symbols descriptions\n");
+            ACTION("Some key symbols definitions may be lost\n");
+            return False;
+        }
+    }
+    return CopyKeyInfo(key, &info->keys[info->nKeys++], True);
+}
+
+static Bool
+AddModMapEntry(SymbolsInfo * info, ModMapEntry * new)
+{
+    ModMapEntry *mm;
+    Bool clobber;
+
+    clobber = (new->defs.merge != MergeAugment);
+    for (mm = info->modMap; mm != NULL; mm = (ModMapEntry *) mm->defs.next)
+    {
+        if (new->haveSymbol && mm->haveSymbol
+            && (new->u.keySym == mm->u.keySym))
+        {
+            unsigned use, ignore;
+            if (mm->modifier != new->modifier)
+            {
+                if (clobber)
+                {
+                    use = new->modifier;
+                    ignore = mm->modifier;
+                }
+                else
+                {
+                    use = mm->modifier;
+                    ignore = new->modifier;
+                }
+                ERROR1
+                    ("%s added to symbol map for multiple modifiers\n",
+                     XkbKeysymText(new->u.keySym, XkbMessage));
+                ACTION2("Using %s, ignoring %s.\n",
+                        XkbModIndexText(use, XkbMessage),
+                        XkbModIndexText(ignore, XkbMessage));
+                mm->modifier = use;
+            }
+            return True;
+        }
+        if ((!new->haveSymbol) && (!mm->haveSymbol) &&
+            (new->u.keyName == mm->u.keyName))
+        {
+            unsigned use, ignore;
+            if (mm->modifier != new->modifier)
+            {
+                if (clobber)
+                {
+                    use = new->modifier;
+                    ignore = mm->modifier;
+                }
+                else
+                {
+                    use = mm->modifier;
+                    ignore = new->modifier;
+                }
+                ERROR1("Key %s added to map for multiple modifiers\n",
+                       longText(new->u.keyName, XkbMessage));
+                ACTION2("Using %s, ignoring %s.\n",
+                        XkbModIndexText(use, XkbMessage),
+                        XkbModIndexText(ignore, XkbMessage));
+                mm->modifier = use;
+            }
+            return True;
+        }
+    }
+    mm = uTypedAlloc(ModMapEntry);
+    if (mm == NULL)
+    {
+        WSGO("Could not allocate modifier map entry\n");
+        ACTION1("Modifier map for %s will be incomplete\n",
+                XkbModIndexText(new->modifier, XkbMessage));
+        return False;
+    }
+    *mm = *new;
+    mm->defs.next = &info->modMap->defs;
+    info->modMap = mm;
+    return True;
+}
+
+/***====================================================================***/
+
+static void
+MergeIncludedSymbols(SymbolsInfo * into, SymbolsInfo * from,
+                     unsigned merge, XkbDescPtr xkb)
+{
+    register int i;
+    KeyInfo *key;
+
+    if (from->errorCount > 0)
+    {
+        into->errorCount += from->errorCount;
+        return;
+    }
+    if (into->name == NULL)
+    {
+        into->name = from->name;
+        from->name = NULL;
+    }
+    for (i = 0; i < XkbNumKbdGroups; i++)
+    {
+        if (from->groupNames[i] != None)
+        {
+            if ((merge != MergeAugment) || (into->groupNames[i] == None))
+                into->groupNames[i] = from->groupNames[i];
+        }
+    }
+    for (i = 0, key = from->keys; i < from->nKeys; i++, key++)
+    {
+        if (merge != MergeDefault)
+            key->defs.merge = merge;
+        if (!AddKeySymbols(into, key, xkb))
+            into->errorCount++;
+    }
+    if (from->modMap != NULL)
+    {
+        ModMapEntry *mm, *next;
+        for (mm = from->modMap; mm != NULL; mm = next)
+        {
+            if (merge != MergeDefault)
+                mm->defs.merge = merge;
+            if (!AddModMapEntry(into, mm))
+                into->errorCount++;
+            next = (ModMapEntry *) mm->defs.next;
+            uFree(mm);
+        }
+        from->modMap = NULL;
+    }
+    if (!MergeAliases(&into->aliases, &from->aliases, merge))
+        into->errorCount++;
+    return;
+}
+
+typedef void (*FileHandler) (XkbFile * /* rtrn */ ,
+                             XkbDescPtr /* xkb */ ,
+                             unsigned /* merge */ ,
+                             SymbolsInfo *      /* included */
+    );
+
+static Bool
+HandleIncludeSymbols(IncludeStmt * stmt,
+                     XkbDescPtr xkb, SymbolsInfo * info, FileHandler hndlr)
+{
+    unsigned newMerge;
+    XkbFile *rtrn;
+    SymbolsInfo included;
+    Bool haveSelf;
+
+    haveSelf = False;
+    if ((stmt->file == NULL) && (stmt->map == NULL))
+    {
+        haveSelf = True;
+        included = *info;
+        bzero(info, sizeof(SymbolsInfo));
+    }
+    else if (ProcessIncludeFile(stmt, XkmSymbolsIndex, &rtrn, &newMerge))
+    {
+        InitSymbolsInfo(&included, xkb);
+        included.fileID = included.dflt.defs.fileID = rtrn->id;
+        included.merge = included.dflt.defs.merge = MergeOverride;
+        if (stmt->modifier)
+        {
+            included.explicit_group = atoi(stmt->modifier) - 1;
+        }
+        else
+        {
+            included.explicit_group = info->explicit_group;
+        }
+        (*hndlr) (rtrn, xkb, MergeOverride, &included);
+        if (stmt->stmt != NULL)
+        {
+            if (included.name != NULL)
+                uFree(included.name);
+            included.name = stmt->stmt;
+            stmt->stmt = NULL;
+        }
+    }
+    else
+    {
+        info->errorCount += 10;
+        return False;
+    }
+    if ((stmt->next != NULL) && (included.errorCount < 1))
+    {
+        IncludeStmt *next;
+        unsigned op;
+        SymbolsInfo next_incl;
+
+        for (next = stmt->next; next != NULL; next = next->next)
+        {
+            if ((next->file == NULL) && (next->map == NULL))
+            {
+                haveSelf = True;
+                MergeIncludedSymbols(&included, info, next->merge, xkb);
+                FreeSymbolsInfo(info);
+            }
+            else if (ProcessIncludeFile(next, XkmSymbolsIndex, &rtrn, &op))
+            {
+                InitSymbolsInfo(&next_incl, xkb);
+                next_incl.fileID = next_incl.dflt.defs.fileID = rtrn->id;
+                next_incl.merge = next_incl.dflt.defs.merge = MergeOverride;
+                if (next->modifier)
+                {
+                    next_incl.explicit_group = atoi(next->modifier) - 1;
+                }
+                else
+                {
+                    next_incl.explicit_group = info->explicit_group;
+                }
+                (*hndlr) (rtrn, xkb, MergeOverride, &next_incl);
+                MergeIncludedSymbols(&included, &next_incl, op, xkb);
+                FreeSymbolsInfo(&next_incl);
+            }
+            else
+            {
+                info->errorCount += 10;
+                return False;
+            }
+        }
+    }
+    if (haveSelf)
+        *info = included;
+    else
+    {
+        MergeIncludedSymbols(info, &included, newMerge, xkb);
+        FreeSymbolsInfo(&included);
+    }
+    return (info->errorCount == 0);
+}
+
+static LookupEntry groupNames[] = {
+    {"group1", 1},
+    {"group2", 2},
+    {"group3", 3},
+    {"group4", 4},
+    {"group5", 5},
+    {"group6", 6},
+    {"group7", 7},
+    {"group8", 8},
+    {NULL, 0}
+};
+
+
+#define        SYMBOLS 1
+#define        ACTIONS 2
+
+static Bool
+GetGroupIndex(KeyInfo * key,
+              ExprDef * arrayNdx, unsigned what, unsigned *ndx_rtrn)
+{
+    const char *name;
+    ExprResult tmp;
+
+    if (what == SYMBOLS)
+        name = "symbols";
+    else
+        name = "actions";
+
+    if (arrayNdx == NULL)
+    {
+        register int i;
+        unsigned defined;
+        if (what == SYMBOLS)
+            defined = key->symsDefined;
+        else
+            defined = key->actsDefined;
+
+        for (i = 0; i < XkbNumKbdGroups; i++)
+        {
+            if ((defined & (1 << i)) == 0)
+            {
+                *ndx_rtrn = i;
+                return True;
+            }
+        }
+        ERROR3("Too many groups of %s for key %s (max %d)\n", name,
+               longText(key->name, XkbMessage), XkbNumKbdGroups + 1);
+        ACTION1("Ignoring %s defined for extra groups\n", name);
+        return False;
+    }
+    if (!ExprResolveInteger
+        (arrayNdx, &tmp, SimpleLookup, (XPointer) groupNames))
+    {
+        ERROR2("Illegal group index for %s of key %s\n", name,
+               longText(key->name, XkbMessage));
+        ACTION("Definition with non-integer array index ignored\n");
+        return False;
+    }
+    if ((tmp.uval < 1) || (tmp.uval > XkbNumKbdGroups))
+    {
+        ERROR3("Group index for %s of key %s is out of range (1..%d)\n",
+               name, longText(key->name, XkbMessage), XkbNumKbdGroups + 1);
+        ACTION2("Ignoring %s for group %d\n", name, tmp.uval);
+        return False;
+    }
+    *ndx_rtrn = tmp.uval - 1;
+    return True;
+}
+
+static Bool
+AddSymbolsToKey(KeyInfo * key,
+                XkbDescPtr xkb,
+                char *field,
+                ExprDef * arrayNdx, ExprDef * value, SymbolsInfo * info)
+{
+    unsigned ndx, nSyms;
+    int i;
+
+    if (!GetGroupIndex(key, arrayNdx, SYMBOLS, &ndx))
+        return False;
+    if (value == NULL)
+    {
+        key->symsDefined |= (1 << ndx);
+        return True;
+    }
+    if (value->op != ExprKeysymList)
+    {
+        ERROR1("Expected a list of symbols, found %s\n",
+               exprOpText(value->op));
+        ACTION2("Ignoring symbols for group %d of %s\n", ndx,
+                longText(key->name, XkbMessage));
+        return False;
+    }
+    if (key->syms[ndx] != NULL)
+    {
+        WSGO2("Symbols for key %s, group %d already defined\n",
+              longText(key->name, XkbMessage), ndx);
+        return False;
+    }
+    nSyms = value->value.list.nSyms;
+    if (((key->numLevels[ndx] < nSyms) || (key->syms[ndx] == NULL)) &&
+        (!ResizeKeyGroup(key, ndx, nSyms, False)))
+    {
+        WSGO2("Could not resize group %d of key %s\n", ndx,
+              longText(key->name, XkbMessage));
+        ACTION("Symbols lost\n");
+        return False;
+    }
+    key->symsDefined |= (1 << ndx);
+    for (i = 0; i < nSyms; i++) {
+        if (!LookupKeysym(value->value.list.syms[i], &key->syms[ndx][i])) {
+            WSGO1("Could not resolve keysym %s\n", value->value.list.syms[i]);
+            key->syms[ndx][i] = NoSymbol;
+        }
+    }
+    for (i = key->numLevels[ndx] - 1;
+         (i >= 0) && (key->syms[ndx][i] == NoSymbol); i--)
+    {
+        key->numLevels[ndx]--;
+    }
+    return True;
+}
+
+static Bool
+AddActionsToKey(KeyInfo * key,
+                XkbDescPtr xkb,
+                char *field,
+                ExprDef * arrayNdx, ExprDef * value, SymbolsInfo * info)
+{
+    register int i;
+    unsigned ndx, nActs;
+    ExprDef *act;
+    XkbAnyAction *toAct;
+
+    if (!GetGroupIndex(key, arrayNdx, ACTIONS, &ndx))
+        return False;
+
+    if (value == NULL)
+    {
+        key->actsDefined |= (1 << ndx);
+        return True;
+    }
+    if (value->op != ExprActionList)
+    {
+        WSGO1("Bad expression type (%d) for action list value\n", value->op);
+        ACTION2("Ignoring actions for group %d of %s\n", ndx,
+                longText(key->name, XkbMessage));
+        return False;
+    }
+    if (key->acts[ndx] != NULL)
+    {
+        WSGO2("Actions for key %s, group %d already defined\n",
+              longText(key->name, XkbMessage), ndx);
+        return False;
+    }
+    for (nActs = 0, act = value->value.child; act != NULL; nActs++)
+    {
+        act = (ExprDef *) act->common.next;
+    }
+    if (nActs < 1)
+    {
+        WSGO("Action list but not actions in AddActionsToKey\n");
+        return False;
+    }
+    if (((key->numLevels[ndx] < nActs) || (key->acts[ndx] == NULL)) &&
+        (!ResizeKeyGroup(key, ndx, nActs, True)))
+    {
+        WSGO2("Could not resize group %d of key %s\n", ndx,
+              longText(key->name, XkbMessage));
+        ACTION("Actions lost\n");
+        return False;
+    }
+    key->actsDefined |= (1 << ndx);
+
+    toAct = (XkbAnyAction *) key->acts[ndx];
+    act = value->value.child;
+    for (i = 0; i < nActs; i++, toAct++)
+    {
+        if (!HandleActionDef(act, xkb, toAct, MergeOverride, info->action))
+        {
+            ERROR1("Illegal action definition for %s\n",
+                   longText(key->name, XkbMessage));
+            ACTION2("Action for group %d/level %d ignored\n", ndx + 1, i + 1);
+        }
+        act = (ExprDef *) act->common.next;
+    }
+    return True;
+}
+
+static int
+SetAllowNone(KeyInfo * key, ExprDef * arrayNdx, ExprDef * value)
+{
+    ExprResult tmp;
+    unsigned radio_groups = 0;
+
+    if (arrayNdx == NULL)
+    {
+        radio_groups = XkbAllRadioGroupsMask;
+    }
+    else
+    {
+        if (!ExprResolveInteger(arrayNdx, &tmp, RadioLookup, NULL))
+        {
+            ERROR("Illegal index in group name definition\n");
+            ACTION("Definition with non-integer array index ignored\n");
+            return False;
+        }
+        if ((tmp.uval < 1) || (tmp.uval > XkbMaxRadioGroups))
+        {
+            ERROR1("Illegal radio group specified (must be 1..%d)\n",
+                   XkbMaxRadioGroups + 1);
+            ACTION1("Value of \"allow none\" for group %d ignored\n",
+                    tmp.uval);
+            return False;
+        }
+        radio_groups |= (1 << (tmp.uval - 1));
+    }
+    if (!ExprResolveBoolean(value, &tmp, NULL, NULL))
+    {
+        ERROR1("Illegal \"allow none\" value for %s\n",
+               longText(key->name, XkbMessage));
+        ACTION("Non-boolean value ignored\n");
+        return False;
+    }
+    if (tmp.uval)
+        key->allowNone |= radio_groups;
+    else
+        key->allowNone &= ~radio_groups;
+    return True;
+}
+
+
+static LookupEntry lockingEntries[] = {
+    {"true", XkbKB_Lock},
+    {"yes", XkbKB_Lock},
+    {"on", XkbKB_Lock},
+    {"false", XkbKB_Default},
+    {"no", XkbKB_Default},
+    {"off", XkbKB_Default},
+    {"permanent", XkbKB_Lock | XkbKB_Permanent},
+    {NULL, 0}
+};
+
+static LookupEntry repeatEntries[] = {
+    {"true", RepeatYes},
+    {"yes", RepeatYes},
+    {"on", RepeatYes},
+    {"false", RepeatNo},
+    {"no", RepeatNo},
+    {"off", RepeatNo},
+    {"default", RepeatUndefined},
+    {NULL, 0}
+};
+
+static LookupEntry rgEntries[] = {
+    {"none", 0},
+    {NULL, 0}
+};
+
+static Bool
+SetSymbolsField(KeyInfo * key,
+                XkbDescPtr xkb,
+                char *field,
+                ExprDef * arrayNdx, ExprDef * value, SymbolsInfo * info)
+{
+    Bool ok = True;
+    ExprResult tmp;
+
+    if (uStrCaseCmp(field, "type") == 0)
+    {
+        ExprResult ndx;
+        if ((!ExprResolveString(value, &tmp, NULL, NULL))
+            && (warningLevel > 0))
+        {
+            WARN("The type field of a key symbol map must be a string\n");
+            ACTION("Ignoring illegal type definition\n");
+        }
+        if (arrayNdx == NULL)
+        {
+            key->dfltType = XkbInternAtom(NULL, tmp.str, False);
+            key->defs.defined |= _Key_Type_Dflt;
+        }
+        else if (!ExprResolveInteger(arrayNdx, &ndx, SimpleLookup,
+                                     (XPointer) groupNames))
+        {
+            ERROR1("Illegal group index for type of key %s\n",
+                   longText(key->name, XkbMessage));
+            ACTION("Definition with non-integer array index ignored\n");
+            return False;
+        }
+        else if ((ndx.uval < 1) || (ndx.uval > XkbNumKbdGroups))
+        {
+            ERROR2
+                ("Group index for type of key %s is out of range (1..%d)\n",
+                 longText(key->name, XkbMessage), XkbNumKbdGroups + 1);
+            ACTION1("Ignoring type for group %d\n", ndx.uval);
+            return False;
+        }
+        else
+        {
+            key->types[ndx.uval - 1] = XkbInternAtom(NULL, tmp.str, False);
+            key->typesDefined |= (1 << (ndx.uval - 1));
+        }
+    }
+    else if (uStrCaseCmp(field, "symbols") == 0)
+        return AddSymbolsToKey(key, xkb, field, arrayNdx, value, info);
+    else if (uStrCaseCmp(field, "actions") == 0)
+        return AddActionsToKey(key, xkb, field, arrayNdx, value, info);
+    else if ((uStrCaseCmp(field, "vmods") == 0) ||
+             (uStrCaseCmp(field, "virtualmods") == 0) ||
+             (uStrCaseCmp(field, "virtualmodifiers") == 0))
+    {
+        ok = ExprResolveModMask(value, &tmp, LookupVModMask, (XPointer) xkb);
+        if (ok)
+        {
+            key->vmodmap = (tmp.uval >> 8);
+            key->defs.defined |= _Key_VModMap;
+        }
+        else
+        {
+            ERROR1("Expected a virtual modifier mask, found %s\n",
+                   exprOpText(value->op));
+            ACTION1("Ignoring virtual modifiers definition for key %s\n",
+                    longText(key->name, XkbMessage));
+        }
+    }
+    else if ((uStrCaseCmp(field, "locking") == 0)
+             || (uStrCaseCmp(field, "lock") == 0)
+             || (uStrCaseCmp(field, "locks") == 0))
+    {
+        ok = ExprResolveEnum(value, &tmp, lockingEntries);
+        if (ok)
+            key->behavior.type = tmp.uval;
+        key->defs.defined |= _Key_Behavior;
+    }
+    else if ((uStrCaseCmp(field, "radiogroup") == 0) ||
+             (uStrCaseCmp(field, "permanentradiogroup") == 0))
+    {
+        Bool permanent = False;
+        if (uStrCaseCmp(field, "permanentradiogroup") == 0)
+            permanent = True;
+        ok = ExprResolveInteger(value, &tmp, SimpleLookup,
+                                (XPointer) rgEntries);
+        if (!ok)
+        {
+            ERROR1("Illegal radio group specification for %s\n",
+                   longText(key->name, XkbMessage));
+            ACTION("Non-integer radio group ignored\n");
+            return False;
+        }
+        if (tmp.uval == 0)
+        {
+            key->behavior.type = XkbKB_Default;
+            key->behavior.data = 0;
+            return ok;
+        }
+        if ((tmp.uval < 1) || (tmp.uval > XkbMaxRadioGroups))
+        {
+            ERROR1
+                ("Radio group specification for %s out of range (1..32)\n",
+                 longText(key->name, XkbMessage));
+            ACTION1("Illegal radio group %d ignored\n", tmp.uval);
+            return False;
+        }
+        key->behavior.type =
+            XkbKB_RadioGroup | (permanent ? XkbKB_Permanent : 0);
+        key->behavior.data = tmp.uval - 1;
+        if (key->allowNone & (1 << (tmp.uval - 1)))
+            key->behavior.data |= XkbKB_RGAllowNone;
+        key->defs.defined |= _Key_Behavior;
+    }
+    else if (uStrCaseEqual(field, "allownone"))
+    {
+        ok = SetAllowNone(key, arrayNdx, value);
+    }
+    else if (uStrCasePrefix("overlay", field) ||
+             uStrCasePrefix("permanentoverlay", field))
+    {
+        Bool permanent = False;
+        char *which;
+        int overlayNdx;
+        if (uStrCasePrefix("permanent", field))
+        {
+            permanent = True;
+            which = &field[sizeof("permanentoverlay") - 1];
+        }
+        else
+        {
+            which = &field[sizeof("overlay") - 1];
+        }
+        if (sscanf(which, "%d", &overlayNdx) == 1)
+        {
+            if (((overlayNdx < 1) || (overlayNdx > 2)) && (warningLevel > 0))
+            {
+                ERROR2("Illegal overlay %d specified for %s\n",
+                       overlayNdx, longText(key->name, XkbMessage));
+                ACTION("Ignored\n");
+                return False;
+            }
+        }
+        else if (*which == '\0')
+            overlayNdx = 1;
+        else if (warningLevel > 0)
+        {
+            ERROR2("Illegal overlay \"%s\" specified for %s\n",
+                   which, longText(key->name, XkbMessage));
+            ACTION("Ignored\n");
+            return False;
+        }
+        ok = ExprResolveKeyName(value, &tmp, NULL, NULL);
+        if (!ok)
+        {
+            ERROR1("Illegal overlay key specification for %s\n",
+                   longText(key->name, XkbMessage));
+            ACTION("Overlay key must be specified by name\n");
+            return False;
+        }
+        if (overlayNdx == 1)
+            key->behavior.type = XkbKB_Overlay1;
+        else
+            key->behavior.type = XkbKB_Overlay2;
+        if (permanent)
+            key->behavior.type |= XkbKB_Permanent;
+
+        key->behavior.data = 0;
+        key->nameForOverlayKey = KeyNameToLong(tmp.keyName.name);
+        key->defs.defined |= _Key_Behavior;
+    }
+    else if ((uStrCaseCmp(field, "repeating") == 0) ||
+             (uStrCaseCmp(field, "repeats") == 0) ||
+             (uStrCaseCmp(field, "repeat") == 0))
+    {
+        ok = ExprResolveEnum(value, &tmp, repeatEntries);
+        if (!ok)
+        {
+            ERROR1("Illegal repeat setting for %s\n",
+                   longText(key->name, XkbMessage));
+            ACTION("Non-boolean repeat setting ignored\n");
+            return False;
+        }
+        key->repeat = tmp.uval;
+        key->defs.defined |= _Key_Repeat;
+    }
+    else if ((uStrCaseCmp(field, "groupswrap") == 0) ||
+             (uStrCaseCmp(field, "wrapgroups") == 0))
+    {
+        ok = ExprResolveBoolean(value, &tmp, NULL, NULL);
+        if (!ok)
+        {
+            ERROR1("Illegal groupsWrap setting for %s\n",
+                   longText(key->name, XkbMessage));
+            ACTION("Non-boolean value ignored\n");
+            return False;
+        }
+        if (tmp.uval)
+            key->groupInfo = XkbWrapIntoRange;
+        else
+            key->groupInfo = XkbClampIntoRange;
+        key->defs.defined |= _Key_GroupInfo;
+    }
+    else if ((uStrCaseCmp(field, "groupsclamp") == 0) ||
+             (uStrCaseCmp(field, "clampgroups") == 0))
+    {
+        ok = ExprResolveBoolean(value, &tmp, NULL, NULL);
+        if (!ok)
+        {
+            ERROR1("Illegal groupsClamp setting for %s\n",
+                   longText(key->name, XkbMessage));
+            ACTION("Non-boolean value ignored\n");
+            return False;
+        }
+        if (tmp.uval)
+            key->groupInfo = XkbClampIntoRange;
+        else
+            key->groupInfo = XkbWrapIntoRange;
+        key->defs.defined |= _Key_GroupInfo;
+    }
+    else if ((uStrCaseCmp(field, "groupsredirect") == 0) ||
+             (uStrCaseCmp(field, "redirectgroups") == 0))
+    {
+        if (!ExprResolveInteger
+            (value, &tmp, SimpleLookup, (XPointer) groupNames))
+        {
+            ERROR1("Illegal group index for redirect of key %s\n",
+                   longText(key->name, XkbMessage));
+            ACTION("Definition with non-integer group ignored\n");
+            return False;
+        }
+        if ((tmp.uval < 1) || (tmp.uval > XkbNumKbdGroups))
+        {
+            ERROR2("Out-of-range (1..%d) group for redirect of key %s\n",
+                   XkbNumKbdGroups, longText(key->name, XkbMessage));
+            ERROR1("Ignoring illegal group %d\n", tmp.uval);
+            return False;
+        }
+        key->groupInfo =
+            XkbSetGroupInfo(0, XkbRedirectIntoRange, tmp.uval - 1);
+        key->defs.defined |= _Key_GroupInfo;
+    }
+    else
+    {
+        ERROR1("Unknown field %s in a symbol interpretation\n", field);
+        ACTION("Definition ignored\n");
+        ok = False;
+    }
+    return ok;
+}
+
+static int
+SetGroupName(SymbolsInfo * info, ExprDef * arrayNdx, ExprDef * value)
+{
+    ExprResult tmp, name;
+
+    if ((arrayNdx == NULL) && (warningLevel > 0))
+    {
+        WARN("You must specify an index when specifying a group name\n");
+        ACTION("Group name definition without array subscript ignored\n");
+        return False;
+    }
+    if (!ExprResolveInteger
+        (arrayNdx, &tmp, SimpleLookup, (XPointer) groupNames))
+    {
+        ERROR("Illegal index in group name definition\n");
+        ACTION("Definition with non-integer array index ignored\n");
+        return False;
+    }
+    if ((tmp.uval < 1) || (tmp.uval > XkbNumKbdGroups))
+    {
+        ERROR1
+            ("Attempt to specify name for illegal group (must be 1..%d)\n",
+             XkbNumKbdGroups + 1);
+        ACTION1("Name for group %d ignored\n", tmp.uval);
+        return False;
+    }
+    if (!ExprResolveString(value, &name, NULL, NULL))
+    {
+        ERROR("Group name must be a string\n");
+        ACTION1("Illegal name for group %d ignored\n", tmp.uval);
+        return False;
+    }
+    info->groupNames[tmp.uval - 1 + info->explicit_group] =
+        XkbInternAtom(NULL, name.str, False);
+
+    return True;
+}
+
+static int
+HandleSymbolsVar(VarDef * stmt, XkbDescPtr xkb, SymbolsInfo * info)
+{
+    ExprResult elem, field, tmp;
+    ExprDef *arrayNdx;
+
+    if (ExprResolveLhs(stmt->name, &elem, &field, &arrayNdx) == 0)
+        return 0;               /* internal error, already reported */
+    if (elem.str && (uStrCaseCmp(elem.str, "key") == 0))
+    {
+        return SetSymbolsField(&info->dflt, xkb, field.str, arrayNdx,
+                               stmt->value, info);
+    }
+    else if ((elem.str == NULL) && ((uStrCaseCmp(field.str, "name") == 0) ||
+                                    (uStrCaseCmp(field.str, "groupname") ==
+                                     0)))
+    {
+        return SetGroupName(info, arrayNdx, stmt->value);
+    }
+    else if ((elem.str == NULL)
+             && ((uStrCaseCmp(field.str, "groupswrap") == 0)
+                 || (uStrCaseCmp(field.str, "wrapgroups") == 0)))
+    {
+        if (!ExprResolveBoolean(stmt->value, &tmp, NULL, NULL))
+        {
+            ERROR("Illegal setting for global groupsWrap\n");
+            ACTION("Non-boolean value ignored\n");
+            return False;
+        }
+        if (tmp.uval)
+            info->groupInfo = XkbWrapIntoRange;
+        else
+            info->groupInfo = XkbClampIntoRange;
+        return True;
+    }
+    else if ((elem.str == NULL)
+             && ((uStrCaseCmp(field.str, "groupsclamp") == 0)
+                 || (uStrCaseCmp(field.str, "clampgroups") == 0)))
+    {
+        if (!ExprResolveBoolean(stmt->value, &tmp, NULL, NULL))
+        {
+            ERROR("Illegal setting for global groupsClamp\n");
+            ACTION("Non-boolean value ignored\n");
+            return False;
+        }
+        if (tmp.uval)
+            info->groupInfo = XkbClampIntoRange;
+        else
+            info->groupInfo = XkbWrapIntoRange;
+        return True;
+    }
+    else if ((elem.str == NULL)
+             && ((uStrCaseCmp(field.str, "groupsredirect") == 0)
+                 || (uStrCaseCmp(field.str, "redirectgroups") == 0)))
+    {
+        if (!ExprResolveInteger(stmt->value, &tmp,
+                                SimpleLookup, (XPointer) groupNames))
+        {
+            ERROR("Illegal group index for global groupsRedirect\n");
+            ACTION("Definition with non-integer group ignored\n");
+            return False;
+        }
+        if ((tmp.uval < 1) || (tmp.uval > XkbNumKbdGroups))
+        {
+            ERROR1
+                ("Out-of-range (1..%d) group for global groupsRedirect\n",
+                 XkbNumKbdGroups);
+            ACTION1("Ignoring illegal group %d\n", tmp.uval);
+            return False;
+        }
+        info->groupInfo = XkbSetGroupInfo(0, XkbRedirectIntoRange, tmp.uval);
+        return True;
+    }
+    else if ((elem.str == NULL) && (uStrCaseCmp(field.str, "allownone") == 0))
+    {
+        return SetAllowNone(&info->dflt, arrayNdx, stmt->value);
+    }
+    return SetActionField(xkb, elem.str, field.str, arrayNdx, stmt->value,
+                          &info->action);
+}
+
+static Bool
+HandleSymbolsBody(VarDef * def,
+                  XkbDescPtr xkb, KeyInfo * key, SymbolsInfo * info)
+{
+    Bool ok = True;
+    ExprResult tmp, field;
+    ExprDef *arrayNdx;
+
+    for (; def != NULL; def = (VarDef *) def->common.next)
+    {
+        if ((def->name) && (def->name->type == ExprFieldRef))
+        {
+            ok = HandleSymbolsVar(def, xkb, info);
+            continue;
+        }
+        else
+        {
+            if (def->name == NULL)
+            {
+                if ((def->value == NULL)
+                    || (def->value->op == ExprKeysymList))
+                    field.str = "symbols";
+                else
+                    field.str = "actions";
+                arrayNdx = NULL;
+            }
+            else
+            {
+                ok = ExprResolveLhs(def->name, &tmp, &field, &arrayNdx);
+            }
+            if (ok)
+                ok = SetSymbolsField(key, xkb, field.str, arrayNdx,
+                                     def->value, info);
+        }
+    }
+    return ok;
+}
+
+static Bool
+SetExplicitGroup(SymbolsInfo * info, KeyInfo * key)
+{
+    unsigned group = info->explicit_group;
+
+    if (group == 0)
+        return True;
+
+    if ((key->typesDefined | key->symsDefined | key->actsDefined) & ~1)
+    {
+        int i;
+        WARN1("For the map %s an explicit group specified\n", info->name);
+        WARN1("but key %s has more than one group defined\n",
+              longText(key->name, XkbMessage));
+        ACTION("All groups except first one will be ignored\n");
+        for (i = 1; i < XkbNumKbdGroups; i++)
+        {
+            key->numLevels[i] = 0;
+            if (key->syms[i] != NULL)
+                uFree(key->syms[i]);
+            key->syms[i] = (KeySym *) NULL;
+            if (key->acts[i] != NULL)
+                uFree(key->acts[i]);
+            key->acts[i] = (XkbAction *) NULL;
+            key->types[i] = (Atom) 0;
+        }
+    }
+    key->typesDefined = key->symsDefined = key->actsDefined = 1 << group;
+
+    key->numLevels[group] = key->numLevels[0];
+    key->numLevels[0] = 0;
+    key->syms[group] = key->syms[0];
+    key->syms[0] = (KeySym *) NULL;
+    key->acts[group] = key->acts[0];
+    key->acts[0] = (XkbAction *) NULL;
+    key->types[group] = key->types[0];
+    key->types[0] = (Atom) 0;
+    return True;
+}
+
+static int
+HandleSymbolsDef(SymbolsDef * stmt,
+                 XkbDescPtr xkb, unsigned merge, SymbolsInfo * info)
+{
+    KeyInfo key;
+
+    InitKeyInfo(&key);
+    CopyKeyInfo(&info->dflt, &key, False);
+    key.defs.merge = stmt->merge;
+    key.name = KeyNameToLong(stmt->keyName);
+    if (!HandleSymbolsBody((VarDef *) stmt->symbols, xkb, &key, info))
+    {
+        info->errorCount++;
+        return False;
+    }
+
+    if (!SetExplicitGroup(info, &key))
+    {
+        info->errorCount++;
+        return False;
+    }
+
+    if (!AddKeySymbols(info, &key, xkb))
+    {
+        info->errorCount++;
+        return False;
+    }
+    return True;
+}
+
+static Bool
+HandleModMapDef(ModMapDef * def,
+                XkbDescPtr xkb, unsigned merge, SymbolsInfo * info)
+{
+    ExprDef *key;
+    ModMapEntry tmp;
+    ExprResult rtrn;
+    Bool ok;
+
+    if (!LookupModIndex(NULL, None, def->modifier, TypeInt, &rtrn))
+    {
+        ERROR("Illegal modifier map definition\n");
+        ACTION1("Ignoring map for non-modifier \"%s\"\n",
+                XkbAtomText(NULL, def->modifier, XkbMessage));
+        return False;
+    }
+    ok = True;
+    tmp.modifier = rtrn.uval;
+    for (key = def->keys; key != NULL; key = (ExprDef *) key->common.next)
+    {
+        if ((key->op == ExprValue) && (key->type == TypeKeyName))
+        {
+            tmp.haveSymbol = False;
+            tmp.u.keyName = KeyNameToLong(key->value.keyName);
+        }
+        else if (ExprResolveKeySym(key, &rtrn, NULL, NULL))
+        {
+            tmp.haveSymbol = True;
+            tmp.u.keySym = rtrn.uval;
+        }
+        else
+        {
+            ERROR("Modmap entries may contain only key names or keysyms\n");
+            ACTION1("Illegal definition for %s modifier ignored\n",
+                    XkbModIndexText(tmp.modifier, XkbMessage));
+            continue;
+        }
+
+        ok = AddModMapEntry(info, &tmp) && ok;
+    }
+    return ok;
+}
+
+static void
+HandleSymbolsFile(XkbFile * file,
+                  XkbDescPtr xkb, unsigned merge, SymbolsInfo * info)
+{
+    ParseCommon *stmt;
+
+    info->name = uStringDup(file->name);
+    stmt = file->defs;
+    while (stmt)
+    {
+        switch (stmt->stmtType)
+        {
+        case StmtInclude:
+            if (!HandleIncludeSymbols((IncludeStmt *) stmt, xkb, info,
+                                      HandleSymbolsFile))
+                info->errorCount++;
+            break;
+        case StmtSymbolsDef:
+            if (!HandleSymbolsDef((SymbolsDef *) stmt, xkb, merge, info))
+                info->errorCount++;
+            break;
+        case StmtVarDef:
+            if (!HandleSymbolsVar((VarDef *) stmt, xkb, info))
+                info->errorCount++;
+            break;
+        case StmtVModDef:
+            if (!HandleVModDef((VModDef *) stmt, merge, &info->vmods))
+                info->errorCount++;
+            break;
+        case StmtInterpDef:
+            ERROR("Interpretation files may not include other types\n");
+            ACTION("Ignoring definition of symbol interpretation\n");
+            info->errorCount++;
+            break;
+        case StmtKeycodeDef:
+            ERROR("Interpretation files may not include other types\n");
+            ACTION("Ignoring definition of key name\n");
+            info->errorCount++;
+            break;
+        case StmtModMapDef:
+            if (!HandleModMapDef((ModMapDef *) stmt, xkb, merge, info))
+                info->errorCount++;
+            break;
+        default:
+            WSGO1("Unexpected statement type %d in HandleSymbolsFile\n",
+                  stmt->stmtType);
+            break;
+        }
+        stmt = stmt->next;
+        if (info->errorCount > 10)
+        {
+#ifdef NOISY
+            ERROR("Too many errors\n");
+#endif
+            ACTION1("Abandoning symbols file \"%s\"\n", file->topName);
+            break;
+        }
+    }
+    return;
+}
+
+static Bool
+FindKeyForSymbol(XkbDescPtr xkb, KeySym sym, unsigned int *kc_rtrn)
+{
+    register int i, j;
+    register Bool gotOne;
+
+    j = 0;
+    do
+    {
+        gotOne = False;
+        for (i = xkb->min_key_code; i <= (int) xkb->max_key_code; i++)
+        {
+            if (j < (int) XkbKeyNumSyms(xkb, i))
+            {
+                gotOne = True;
+                if (XkbKeySym(xkb, i, j) == sym)
+                {
+                    *kc_rtrn = i;
+                    return True;
+                }
+            }
+        }
+        j++;
+    }
+    while (gotOne);
+    return False;
+}
+
+/**
+ * Find the given name in the xkb->map->types and return its index.
+ *
+ * @param name The atom to search for.
+ * @param type_rtrn Set to the index of the name if found.
+ *
+ * @return True if found, False otherwise.
+ */
+static Bool
+FindNamedType(XkbDescPtr xkb, Atom name, unsigned *type_rtrn)
+{
+    register unsigned n;
+
+    if (xkb && xkb->map && xkb->map->types)
+    {
+        for (n = 0; n < xkb->map->num_types; n++)
+        {
+            if (xkb->map->types[n].name == (Atom) name)
+            {
+                *type_rtrn = n;
+                return True;
+            }
+        }
+    }
+    return False;
+}
+
+static Bool
+KSIsLower(KeySym ks)
+{
+    KeySym lower, upper;
+    XConvertCase(ks, &lower, &upper);
+
+    if (lower == upper)
+        return False;
+    return (ks == lower ? True : False);
+}
+
+static Bool
+KSIsUpper(KeySym ks)
+{
+    KeySym lower, upper;
+    XConvertCase(ks, &lower, &upper);
+
+    if (lower == upper)
+        return False;
+    return (ks == upper ? True : False);
+}
+
+/**
+ * Assign a type to the given sym and return the Atom for the type assigned.
+ *
+ * Simple recipe:
+ * - ONE_LEVEL for width 0/1
+ * - ALPHABETIC for 2 shift levels, with lower/upercase
+ * - KEYPAD for keypad keys.
+ * - TWO_LEVEL for other 2 shift level keys.
+ * and the same for four level keys.
+ *
+ * @param width Number of sysms in syms.
+ * @param syms The keysyms for the given key (must be size width).
+ * @param typeNameRtrn Set to the Atom of the type name.
+ *
+ * @returns True if a type could be found, False otherwise.
+ */
+static Bool
+FindAutomaticType(int width, KeySym * syms, Atom * typeNameRtrn,
+                  Bool * autoType)
+{
+    *autoType = False;
+    if ((width == 1) || (width == 0))
+    {
+        *typeNameRtrn = XkbInternAtom(NULL, "ONE_LEVEL", False);
+        *autoType = True;
+    }
+    else if (width == 2)
+    {
+        if (syms && KSIsLower(syms[0]) && KSIsUpper(syms[1]))
+        {
+            *typeNameRtrn = XkbInternAtom(NULL, "ALPHABETIC", False);
+        }
+        else if (syms && (XkbKSIsKeypad(syms[0]) || XkbKSIsKeypad(syms[1])))
+        {
+            *typeNameRtrn = XkbInternAtom(NULL, "KEYPAD", False);
+            *autoType = True;
+        }
+        else
+        {
+            *typeNameRtrn = XkbInternAtom(NULL, "TWO_LEVEL", False);
+            *autoType = True;
+        }
+    }
+    else if (width <= 4)
+    {
+        if (syms && KSIsLower(syms[0]) && KSIsUpper(syms[1]))
+            if (KSIsLower(syms[2]) && KSIsUpper(syms[3]))
+                *typeNameRtrn =
+                    XkbInternAtom(NULL, "FOUR_LEVEL_ALPHABETIC", False);
+            else
+                *typeNameRtrn = XkbInternAtom(NULL,
+                                              "FOUR_LEVEL_SEMIALPHABETIC",
+                                              False);
+
+        else if (syms && (XkbKSIsKeypad(syms[0]) || XkbKSIsKeypad(syms[1])))
+            *typeNameRtrn = XkbInternAtom(NULL, "FOUR_LEVEL_KEYPAD", False);
+        else
+            *typeNameRtrn = XkbInternAtom(NULL, "FOUR_LEVEL", False);
+        /* XXX: why not set autoType here? */
+    }
+    return ((width >= 0) && (width <= 4));
+}
+
+/**
+ * Ensure the given KeyInfo is in a coherent state, i.e. no gaps between the
+ * groups, and reduce to one group if all groups are identical anyway.
+ */
+static void
+PrepareKeyDef(KeyInfo * key)
+{
+    int i, j, width, defined, lastGroup;
+    Bool identical;
+
+    defined = key->symsDefined | key->actsDefined | key->typesDefined;
+    /* get highest group number */
+    for (i = XkbNumKbdGroups - 1; i >= 0; i--)
+    {
+        if (defined & (1 << i))
+            break;
+    }
+    lastGroup = i;
+
+    if (lastGroup == 0)
+        return;
+
+    /* If there are empty groups between non-empty ones fill them with data */
+    /* from the first group. */
+    /* We can make a wrong assumption here. But leaving gaps is worse. */
+    for (i = lastGroup; i > 0; i--)
+    {
+        if (defined & (1 << i))
+            continue;
+        width = key->numLevels[0];
+        if (key->typesDefined & 1)
+        {
+            for (j = 0; j < width; j++)
+            {
+                key->types[i] = key->types[0];
+            }
+            key->typesDefined |= 1 << i;
+        }
+        if ((key->actsDefined & 1) && key->acts[0])
+        {
+            key->acts[i] = uTypedCalloc(width, XkbAction);
+            if (key->acts[i] == NULL)
+                continue;
+            memcpy((void *) key->acts[i], (void *) key->acts[0],
+                   width * sizeof(XkbAction));
+            key->actsDefined |= 1 << i;
+        }
+        if ((key->symsDefined & 1) && key->syms[0])
+        {
+            key->syms[i] = uTypedCalloc(width, KeySym);
+            if (key->syms[i] == NULL)
+                continue;
+            memcpy((void *) key->syms[i], (void *) key->syms[0],
+                   width * sizeof(KeySym));
+            key->symsDefined |= 1 << i;
+        }
+        if (defined & 1)
+        {
+            key->numLevels[i] = key->numLevels[0];
+        }
+    }
+    /* If all groups are completely identical remove them all */
+    /* exept the first one. */
+    identical = True;
+    for (i = lastGroup; i > 0; i--)
+    {
+        if ((key->numLevels[i] != key->numLevels[0]) ||
+            (key->types[i] != key->types[0]))
+        {
+            identical = False;
+            break;
+        }
+        if ((key->syms[i] != key->syms[0]) &&
+            (key->syms[i] == NULL || key->syms[0] == NULL ||
+             memcmp((void *) key->syms[i], (void *) key->syms[0],
+                    sizeof(KeySym) * key->numLevels[0])))
+        {
+            identical = False;
+            break;
+        }
+        if ((key->acts[i] != key->acts[0]) &&
+            (key->acts[i] == NULL || key->acts[0] == NULL ||
+             memcmp((void *) key->acts[i], (void *) key->acts[0],
+                    sizeof(XkbAction) * key->numLevels[0])))
+        {
+            identical = False;
+            break;
+        }
+    }
+    if (identical)
+    {
+        for (i = lastGroup; i > 0; i--)
+        {
+            key->numLevels[i] = 0;
+            if (key->syms[i] != NULL)
+                uFree(key->syms[i]);
+            key->syms[i] = (KeySym *) NULL;
+            if (key->acts[i] != NULL)
+                uFree(key->acts[i]);
+            key->acts[i] = (XkbAction *) NULL;
+            key->types[i] = (Atom) 0;
+        }
+        key->symsDefined &= 1;
+        key->actsDefined &= 1;
+        key->typesDefined &= 1;
+    }
+    return;
+}
+
+/**
+ * Copy the KeyInfo into result.
+ *
+ * This function recurses.
+ */
+static Bool
+CopySymbolsDef(XkbFileInfo * result, KeyInfo * key, int start_from)
+{
+    register int i;
+    unsigned okc, kc, width, tmp, nGroups;
+    XkbKeyTypePtr type;
+    Bool haveActions, autoType, useAlias;
+    KeySym *outSyms;
+    XkbAction *outActs;
+    XkbDescPtr xkb;
+    unsigned types[XkbNumKbdGroups];
+
+    xkb = result->xkb;
+    useAlias = (start_from == 0);
+
+    /* get the keycode for the key. */
+    if (!FindNamedKey(xkb, key->name, &kc, useAlias, CreateKeyNames(xkb),
+                      start_from))
+    {
+        if ((start_from == 0) && (warningLevel >= 5))
+        {
+            WARN2("Key %s not found in %s keycodes\n",
+                  longText(key->name, XkbMessage),
+                  XkbAtomText(NULL, xkb->names->keycodes, XkbMessage));
+            ACTION("Symbols ignored\n");
+        }
+        return False;
+    }
+
+    haveActions = False;
+    for (i = width = nGroups = 0; i < XkbNumKbdGroups; i++)
+    {
+        if (((i + 1) > nGroups)
+            && (((key->symsDefined | key->actsDefined) & (1 << i))
+                || (key->typesDefined) & (1 << i)))
+            nGroups = i + 1;
+        if (key->acts[i])
+            haveActions = True;
+        autoType = False;
+        /* Assign the type to the key, if it is missing. */
+        if (key->types[i] == None)
+        {
+            if (key->dfltType != None)
+                key->types[i] = key->dfltType;
+            else if (FindAutomaticType(key->numLevels[i], key->syms[i],
+                                       &key->types[i], &autoType))
+            {
+            }
+            else
+            {
+                if (warningLevel >= 5)
+                {
+                    WARN1("No automatic type for %d symbols\n",
+                          (unsigned int) key->numLevels[i]);
+                    ACTION3("Using %s for the %s key (keycode %d)\n",
+                            XkbAtomText(NULL, key->types[i],
+                                        XkbMessage),
+                            longText(key->name, XkbMessage), kc);
+                }
+            }
+        }
+        if (FindNamedType(xkb, key->types[i], &types[i]))
+        {
+            if (!autoType || key->numLevels[i] > 2)
+                xkb->server->explicit[kc] |= (1 << i);
+        }
+        else
+        {
+            if (warningLevel >= 3)
+            {
+                WARN1("Type \"%s\" is not defined\n",
+                      XkbAtomText(NULL, key->types[i], XkbMessage));
+                ACTION2("Using TWO_LEVEL for the %s key (keycode %d)\n",
+                        longText(key->name, XkbMessage), kc);
+            }
+            types[i] = XkbTwoLevelIndex;
+        }
+        /* if the type specifies less syms than the key has, shrink the key */
+        type = &xkb->map->types[types[i]];
+        if (type->num_levels < key->numLevels[i])
+        {
+            if (warningLevel > 0)
+            {
+                WARN4
+                    ("Type \"%s\" has %d levels, but %s has %d symbols\n",
+                     XkbAtomText(NULL, type->name, XkbMessage),
+                     (unsigned int) type->num_levels,
+                     longText(key->name, XkbMessage),
+                     (unsigned int) key->numLevels[i]);
+                ACTION("Ignoring extra symbols\n");
+            }
+            key->numLevels[i] = type->num_levels;
+        }
+        if (key->numLevels[i] > width)
+            width = key->numLevels[i];
+        if (type->num_levels > width)
+            width = type->num_levels;
+    }
+
+    /* width is now the largest width found */
+
+    i = width * nGroups;
+    outSyms = XkbResizeKeySyms(xkb, kc, i);
+    if (outSyms == NULL)
+    {
+        WSGO2("Could not enlarge symbols for %s (keycode %d)\n",
+              longText(key->name, XkbMessage), kc);
+        return False;
+    }
+    if (haveActions)
+    {
+        outActs = XkbResizeKeyActions(xkb, kc, i);
+        if (outActs == NULL)
+        {
+            WSGO2("Could not enlarge actions for %s (key %d)\n",
+                  longText(key->name, XkbMessage), kc);
+            return False;
+        }
+        xkb->server->explicit[kc] |= XkbExplicitInterpretMask;
+    }
+    else
+        outActs = NULL;
+    if (key->defs.defined & _Key_GroupInfo)
+        i = key->groupInfo;
+    else
+        i = xkb->map->key_sym_map[kc].group_info;
+
+    xkb->map->key_sym_map[kc].group_info = XkbSetNumGroups(i, nGroups);
+    xkb->map->key_sym_map[kc].width = width;
+    for (i = 0; i < nGroups; i++)
+    {
+        /* assign kt_index[i] to the index of the type in map->types.
+         * kt_index[i] may have been set by a previous run (if we have two
+         * layouts specified). Let's not overwrite it with the ONE_LEVEL
+         * default group if we dont even have keys for this group anyway.
+         *
+         * FIXME: There should be a better fix for this.
+         */
+        if (key->numLevels[i])
+            xkb->map->key_sym_map[kc].kt_index[i] = types[i];
+        if (key->syms[i] != NULL)
+        {
+            /* fill key to "width" symbols*/
+            for (tmp = 0; tmp < width; tmp++)
+            {
+                if (tmp < key->numLevels[i])
+                    outSyms[tmp] = key->syms[i][tmp];
+                else
+                    outSyms[tmp] = NoSymbol;
+                if ((outActs != NULL) && (key->acts[i] != NULL))
+                {
+                    if (tmp < key->numLevels[i])
+                        outActs[tmp] = key->acts[i][tmp];
+                    else
+                        outActs[tmp].type = XkbSA_NoAction;
+                }
+            }
+        }
+        outSyms += width;
+        if (outActs)
+            outActs += width;
+    }
+    switch (key->behavior.type & XkbKB_OpMask)
+    {
+    case XkbKB_Default:
+        break;
+    case XkbKB_Overlay1:
+    case XkbKB_Overlay2:
+        /* find key by name! */
+        if (!FindNamedKey(xkb, key->nameForOverlayKey, &okc, True,
+                          CreateKeyNames(xkb), 0))
+        {
+            if (warningLevel >= 1)
+            {
+                WARN2("Key %s not found in %s keycodes\n",
+                      longText(key->nameForOverlayKey, XkbMessage),
+                      XkbAtomText(NULL, xkb->names->keycodes, XkbMessage));
+                ACTION1("Not treating %s as an overlay key \n",
+                        longText(key->name, XkbMessage));
+            }
+            break;
+        }
+        key->behavior.data = okc;
+    default:
+        xkb->server->behaviors[kc] = key->behavior;
+        xkb->server->explicit[kc] |= XkbExplicitBehaviorMask;
+        break;
+    }
+    if (key->defs.defined & _Key_VModMap)
+    {
+        xkb->server->vmodmap[kc] = key->vmodmap;
+        xkb->server->explicit[kc] |= XkbExplicitVModMapMask;
+    }
+    if (key->repeat != RepeatUndefined)
+    {
+        if (key->repeat == RepeatYes)
+            xkb->ctrls->per_key_repeat[kc / 8] |= (1 << (kc % 8));
+        else
+            xkb->ctrls->per_key_repeat[kc / 8] &= ~(1 << (kc % 8));
+        xkb->server->explicit[kc] |= XkbExplicitAutoRepeatMask;
+    }
+
+    /* do the same thing for the next key */
+    CopySymbolsDef(result, key, kc + 1);
+    return True;
+}
+
+static Bool
+CopyModMapDef(XkbFileInfo * result, ModMapEntry * entry)
+{
+    unsigned kc;
+    XkbDescPtr xkb;
+
+    xkb = result->xkb;
+    if ((!entry->haveSymbol)
+        &&
+        (!FindNamedKey
+         (xkb, entry->u.keyName, &kc, True, CreateKeyNames(xkb), 0)))
+    {
+        if (warningLevel >= 5)
+        {
+            WARN2("Key %s not found in %s keycodes\n",
+                  longText(entry->u.keyName, XkbMessage),
+                  XkbAtomText(NULL, xkb->names->keycodes, XkbMessage));
+            ACTION1("Modifier map entry for %s not updated\n",
+                    XkbModIndexText(entry->modifier, XkbMessage));
+        }
+        return False;
+    }
+    else if (entry->haveSymbol
+             && (!FindKeyForSymbol(xkb, entry->u.keySym, &kc)))
+    {
+        if (warningLevel > 5)
+        {
+            WARN2("Key \"%s\" not found in %s symbol map\n",
+                  XkbKeysymText(entry->u.keySym, XkbMessage),
+                  XkbAtomText(NULL, xkb->names->symbols, XkbMessage));
+            ACTION1("Modifier map entry for %s not updated\n",
+                    XkbModIndexText(entry->modifier, XkbMessage));
+        }
+        return False;
+    }
+    xkb->map->modmap[kc] |= (1 << entry->modifier);
+    return True;
+}
+
+/**
+ * Handle the xkb_symbols section of an xkb file.
+ *
+ * @param file The parsed xkb_symbols section of the xkb file.
+ * @param result Handle to the data to store the result in.
+ * @param merge Merge strategy (e.g. MergeOverride).
+ */
+Bool
+CompileSymbols(XkbFile * file, XkbFileInfo * result, unsigned merge)
+{
+    register int i;
+    SymbolsInfo info;
+    XkbDescPtr xkb;
+
+    xkb = result->xkb;
+    InitSymbolsInfo(&info, xkb);
+    info.dflt.defs.fileID = file->id;
+    info.dflt.defs.merge = merge;
+    HandleSymbolsFile(file, xkb, merge, &info);
+
+    if (info.nKeys == 0)
+        return True;
+    if (info.errorCount == 0)
+    {
+        KeyInfo *key;
+
+        /* alloc memory in the xkb struct */
+        if (XkbAllocNames(xkb, XkbSymbolsNameMask | XkbGroupNamesMask, 0, 0)
+            != Success)
+        {
+            WSGO("Can not allocate names in CompileSymbols\n");
+            ACTION("Symbols not added\n");
+            return False;
+        }
+        if (XkbAllocClientMap(xkb, XkbKeySymsMask | XkbModifierMapMask, 0)
+            != Success)
+        {
+            WSGO("Could not allocate client map in CompileSymbols\n");
+            ACTION("Symbols not added\n");
+            return False;
+        }
+        if (XkbAllocServerMap(xkb, XkbAllServerInfoMask, 32) != Success)
+        {
+            WSGO("Could not allocate server map in CompileSymbols\n");
+            ACTION("Symbols not added\n");
+            return False;
+        }
+        if (XkbAllocControls(xkb, XkbPerKeyRepeatMask) != Success)
+        {
+            WSGO("Could not allocate controls in CompileSymbols\n");
+            ACTION("Symbols not added\n");
+            return False;
+        }
+
+        /* now copy info into xkb. */
+        xkb->names->symbols = XkbInternAtom(xkb->dpy, info.name, False);
+        if (info.aliases)
+            ApplyAliases(xkb, False, &info.aliases);
+        for (i = 0; i < XkbNumKbdGroups; i++)
+        {
+            if (info.groupNames[i] != None)
+                xkb->names->groups[i] = info.groupNames[i];
+        }
+        /* sanitize keys */
+        for (key = info.keys, i = 0; i < info.nKeys; i++, key++)
+        {
+            PrepareKeyDef(key);
+        }
+        /* copy! */
+        for (key = info.keys, i = 0; i < info.nKeys; i++, key++)
+        {
+            if (!CopySymbolsDef(result, key, 0))
+                info.errorCount++;
+        }
+        if (warningLevel > 3)
+        {
+            for (i = xkb->min_key_code; i <= xkb->max_key_code; i++)
+            {
+                if (xkb->names->keys[i].name[0] == '\0')
+                    continue;
+                if (XkbKeyNumGroups(xkb, i) < 1)
+                {
+                    char buf[5];
+                    memcpy(buf, xkb->names->keys[i].name, 4);
+                    buf[4] = '\0';
+                    WARN2
+                        ("No symbols defined for <%s> (keycode %d)\n",
+                         buf, i);
+                }
+            }
+        }
+        if (info.modMap)
+        {
+            ModMapEntry *mm, *next;
+            for (mm = info.modMap; mm != NULL; mm = next)
+            {
+                if (!CopyModMapDef(result, mm))
+                    info.errorCount++;
+                next = (ModMapEntry *) mm->defs.next;
+            }
+        }
+        return True;
+    }
+    return False;
+}
diff --git a/tokens.h b/tokens.h
new file mode 100644 (file)
index 0000000..970f3d4
--- /dev/null
+++ b/tokens.h
@@ -0,0 +1,104 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 TOKENS_H
+#define        TOKENS_H 1
+
+#define        END_OF_FILE     0
+#define        ERROR_TOK       255
+
+#define        XKB_KEYMAP      1
+#define        XKB_KEYCODES    2
+#define        XKB_TYPES       3
+#define        XKB_SYMBOLS     4
+#define        XKB_COMPATMAP   5
+#define        XKB_GEOMETRY    6
+#define        XKB_SEMANTICS   7
+#define        XKB_LAYOUT      8
+
+#define        INCLUDE         10
+#define        OVERRIDE        11
+#define        AUGMENT         12
+#define        REPLACE         13
+#define        ALTERNATE       14
+
+#define        VIRTUAL_MODS    20
+#define        TYPE            21
+#define        INTERPRET       22
+#define        ACTION_TOK      23
+#define        KEY             24
+#define        ALIAS           25
+#define        GROUP           26
+#define        MODIFIER_MAP    27
+#define        INDICATOR       28
+#define        SHAPE           29
+#define        KEYS            30
+#define        ROW             31
+#define        SECTION         32
+#define        OVERLAY         33
+#define        TEXT            34
+#define        OUTLINE         35
+#define        SOLID           36
+#define        LOGO            37
+#define        VIRTUAL         38
+
+#define        EQUALS          40
+#define        PLUS            41
+#define        MINUS           42
+#define        DIVIDE          43
+#define        TIMES           44
+#define        OBRACE          45
+#define        CBRACE          46
+#define        OPAREN          47
+#define        CPAREN          48
+#define        OBRACKET        49
+#define        CBRACKET        50
+#define        DOT             51
+#define        COMMA           52
+#define        SEMI            53
+#define        EXCLAM          54
+#define        INVERT          55
+
+#define        STRING          60
+#define        INTEGER         61
+#define        FLOAT           62
+#define        IDENT           63
+#define        KEYNAME         64
+
+#define        PARTIAL         70
+#define        DEFAULT         71
+#define        HIDDEN          72
+#define        ALPHANUMERIC_KEYS       73
+#define        MODIFIER_KEYS           74
+#define        KEYPAD_KEYS             75
+#define        FUNCTION_KEYS           76
+#define        ALTERNATE_GROUP         77
+
+extern Atom tok_ONE_LEVEL;
+extern Atom tok_TWO_LEVEL;
+extern Atom tok_ALPHABETIC;
+extern Atom tok_KEYPAD;
+
+#endif
diff --git a/utils.c b/utils.c
new file mode 100644 (file)
index 0000000..55efbe1
--- /dev/null
+++ b/utils.c
@@ -0,0 +1,434 @@
+
+  /*\
+   *
+   *                          COPYRIGHT 1990
+   *                    DIGITAL EQUIPMENT CORPORATION
+   *                       MAYNARD, MASSACHUSETTS
+   *                        ALL RIGHTS RESERVED.
+   *
+   * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
+   * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
+   * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE 
+   * FOR ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED 
+   * WARRANTY.
+   *
+   * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT
+   * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN
+   * ADDITION TO THAT SET FORTH ABOVE.
+   *
+   * Permission to use, copy, modify, and distribute this software and its
+   * documentation for any purpose and without fee is hereby granted, 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 Digital Equipment Corporation not be
+   * used in advertising or publicity pertaining to distribution of the 
+   * software without specific, written prior permission.
+   \*/
+
+#include       "utils.h"
+#include       <ctype.h>
+#include       <stdlib.h>
+#include       <stdarg.h>
+
+/***====================================================================***/
+
+Opaque
+uAlloc(unsigned size)
+{
+    return ((Opaque) malloc(size));
+}
+
+/***====================================================================***/
+
+Opaque
+uCalloc(unsigned n, unsigned size)
+{
+    return ((Opaque) calloc(n, size));
+}
+
+/***====================================================================***/
+
+Opaque
+uRealloc(Opaque old, unsigned newSize)
+{
+    if (old == NULL)
+        return ((Opaque) malloc(newSize));
+    else
+        return ((Opaque) realloc((char *) old, newSize));
+}
+
+/***====================================================================***/
+
+Opaque
+uRecalloc(Opaque old, unsigned nOld, unsigned nNew, unsigned itemSize)
+{
+    char *rtrn;
+
+    if (old == NULL)
+        rtrn = (char *) calloc(nNew, itemSize);
+    else
+    {
+        rtrn = (char *) realloc((char *) old, nNew * itemSize);
+        if ((rtrn) && (nNew > nOld))
+        {
+            bzero(&rtrn[nOld * itemSize], (nNew - nOld) * itemSize);
+        }
+    }
+    return (Opaque) rtrn;
+}
+
+/***====================================================================***/
+
+void
+uFree(Opaque ptr)
+{
+    if (ptr != (Opaque) NULL)
+        free((char *) ptr);
+    return;
+}
+
+/***====================================================================***/
+/***                  FUNCTION ENTRY TRACKING                           ***/
+/***====================================================================***/
+
+static FILE *entryFile = NULL;
+int uEntryLevel;
+
+Boolean
+uSetEntryFile(char *name)
+{
+    if ((entryFile != NULL) && (entryFile != stderr))
+    {
+        fprintf(entryFile, "switching to %s\n", name ? name : "stderr");
+        fclose(entryFile);
+    }
+    if (name != NullString)
+        entryFile = fopen(name, "w");
+    else
+        entryFile = stderr;
+    if (entryFile == NULL)
+    {
+        entryFile = stderr;
+        return (False);
+    }
+    return (True);
+}
+
+void
+uEntry(int l, char *s, ...)
+{
+    int i;
+    va_list args;
+
+    for (i = 0; i < uEntryLevel; i++)
+    {
+        putc(' ', entryFile);
+    }
+    va_start(args, s);
+    vfprintf(entryFile, s, args);
+    va_end(args);
+    uEntryLevel += l;
+}
+
+void
+uExit(int l, char *rtVal)
+{
+    int i;
+
+    uEntryLevel -= l;
+    if (uEntryLevel < 0)
+        uEntryLevel = 0;
+    for (i = 0; i < uEntryLevel; i++)
+    {
+        putc(' ', entryFile);
+    }
+    fprintf(entryFile, "---> %p\n", rtVal);
+    return;
+}
+
+/***====================================================================***/
+/***                   PRINT FUNCTIONS                                 ***/
+/***====================================================================***/
+
+FILE *uDebugFile = NULL;
+int uDebugIndentLevel = 0;
+int uDebugIndentSize = 4;
+
+Boolean
+uSetDebugFile(char *name)
+{
+    if ((uDebugFile != NULL) && (uDebugFile != stderr))
+    {
+        fprintf(uDebugFile, "switching to %s\n", name ? name : "stderr");
+        fclose(uDebugFile);
+    }
+    if (name != NullString)
+        uDebugFile = fopen(name, "w");
+    else
+        uDebugFile = stderr;
+    if (uDebugFile == NULL)
+    {
+        uDebugFile = stderr;
+        return (False);
+    }
+    return (True);
+}
+
+void
+uDebug(char *s, ...)
+{
+    int i;
+    va_list args;
+
+    for (i = (uDebugIndentLevel * uDebugIndentSize); i > 0; i--)
+    {
+        putc(' ', uDebugFile);
+    }
+    va_start(args, s);
+    vfprintf(uDebugFile, s, args);
+    va_end(args);
+    fflush(uDebugFile);
+}
+
+void
+uDebugNOI(char *s, ...)
+{
+    va_list args;
+
+    va_start(args, s);
+    vfprintf(uDebugFile, s, args);
+    va_end(args);
+    fflush(uDebugFile);
+}
+
+/***====================================================================***/
+
+static FILE *errorFile = NULL;
+static int outCount = 0;
+static char *preMsg = NULL;
+static char *postMsg = NULL;
+static char *prefix = NULL;
+
+Boolean
+uSetErrorFile(char *name)
+{
+    if ((errorFile != NULL) && (errorFile != stderr))
+    {
+        fprintf(errorFile, "switching to %s\n", name ? name : "stderr");
+        fclose(errorFile);
+    }
+    if (name != NullString)
+        errorFile = fopen(name, "w");
+    else
+        errorFile = stderr;
+    if (errorFile == NULL)
+    {
+        errorFile = stderr;
+        return (False);
+    }
+    return (True);
+}
+
+void
+uInformation(const char *s, ...)
+{
+    va_list args;
+
+    va_start(args, s);
+    vfprintf(errorFile, s, args);
+    va_end(args);
+    fflush(errorFile);
+}
+
+/***====================================================================***/
+
+void
+uAction(const char *s, ...)
+{
+    va_list args;
+
+    if (prefix != NULL)
+        fprintf(errorFile, "%s", prefix);
+    fprintf(errorFile, "                  ");
+    va_start(args, s);
+    vfprintf(errorFile, s, args);
+    va_end(args);
+    fflush(errorFile);
+}
+
+/***====================================================================***/
+
+void
+uWarning(const char *s, ...)
+{
+    va_list args;
+
+    if ((outCount == 0) && (preMsg != NULL))
+        fprintf(errorFile, "%s\n", preMsg);
+    if (prefix != NULL)
+        fprintf(errorFile, "%s", prefix);
+    fprintf(errorFile, "Warning:          ");
+    va_start(args, s);
+    vfprintf(errorFile, s, args);
+    va_end(args);
+    fflush(errorFile);
+    outCount++;
+}
+
+/***====================================================================***/
+
+void
+uError(const char *s, ...)
+{
+    va_list args;
+
+    if ((outCount == 0) && (preMsg != NULL))
+        fprintf(errorFile, "%s\n", preMsg);
+    if (prefix != NULL)
+        fprintf(errorFile, "%s", prefix);
+    fprintf(errorFile, "Error:            ");
+    va_start(args, s);
+    vfprintf(errorFile, s, args);
+    va_end(args);
+    fflush(errorFile);
+    outCount++;
+}
+
+/***====================================================================***/
+
+void
+uFatalError(const char *s, ...)
+{
+    va_list args;
+
+    if ((outCount == 0) && (preMsg != NULL))
+        fprintf(errorFile, "%s\n", preMsg);
+    if (prefix != NULL)
+        fprintf(errorFile, "%s", prefix);
+    fprintf(errorFile, "Fatal Error:      ");
+    va_start(args, s);
+    vfprintf(errorFile, s, args);
+    va_end(args);
+    fprintf(errorFile, "                  Exiting\n");
+    fflush(errorFile);
+    outCount++;
+    exit(1);
+    /* NOTREACHED */
+}
+
+/***====================================================================***/
+
+void
+uInternalError(const char *s, ...)
+{
+    va_list args;
+
+    if ((outCount == 0) && (preMsg != NULL))
+        fprintf(errorFile, "%s\n", preMsg);
+    if (prefix != NULL)
+        fprintf(errorFile, "%s", prefix);
+    fprintf(errorFile, "Internal error:   ");
+    va_start(args, s);
+    vfprintf(errorFile, s, args);
+    va_end(args);
+    fflush(errorFile);
+    outCount++;
+}
+
+void
+uSetPreErrorMessage(char *msg)
+{
+    outCount = 0;
+    preMsg = msg;
+    return;
+}
+
+void
+uSetPostErrorMessage(char *msg)
+{
+    postMsg = msg;
+    return;
+}
+
+void
+uSetErrorPrefix(char *pre)
+{
+    prefix = pre;
+    return;
+}
+
+void
+uFinishUp(void)
+{
+    if ((outCount > 0) && (postMsg != NULL))
+        fprintf(errorFile, "%s\n", postMsg);
+    return;
+}
+
+/***====================================================================***/
+
+#ifndef HAVE_STRDUP
+char *
+uStringDup(const char *str)
+{
+    char *rtrn;
+
+    if (str == NULL)
+        return NULL;
+    rtrn = (char *) uAlloc(strlen(str) + 1);
+    strcpy(rtrn, str);
+    return rtrn;
+}
+#endif
+
+#ifndef HAVE_STRCASECMP
+int
+uStrCaseCmp(const char *str1, const char *str2)
+{
+    char buf1[512], buf2[512];
+    char c, *s;
+    register int n;
+
+    for (n = 0, s = buf1; (c = *str1++); n++)
+    {
+        if (isupper(c))
+            c = tolower(c);
+        if (n > 510)
+            break;
+        *s++ = c;
+    }
+    *s = '\0';
+    for (n = 0, s = buf2; (c = *str2++); n++)
+    {
+        if (isupper(c))
+            c = tolower(c);
+        if (n > 510)
+            break;
+        *s++ = c;
+    }
+    *s = '\0';
+    return (strcmp(buf1, buf2));
+}
+
+int
+uStrCasePrefix(const char *my_prefix, char *str)
+{
+    char c1;
+    char c2;
+    while (((c1 = *my_prefix) != '\0') && ((c2 = *str) != '\0'))
+    {
+        if (isupper(c1))
+            c1 = tolower(c1);
+        if (isupper(c2))
+            c2 = tolower(c2);
+        if (c1 != c2)
+            return 0;
+        my_prefix++;
+        str++;
+    }
+    if (c1 != '\0')
+        return 0;
+    return 1;
+}
+
+#endif
diff --git a/utils.h b/utils.h
new file mode 100644 (file)
index 0000000..63eda36
--- /dev/null
+++ b/utils.h
@@ -0,0 +1,338 @@
+#ifndef UTILS_H
+#define        UTILS_H 1
+
+  /*\
+   *
+   *                          COPYRIGHT 1990
+   *                    DIGITAL EQUIPMENT CORPORATION
+   *                       MAYNARD, MASSACHUSETTS
+   *                        ALL RIGHTS RESERVED.
+   *
+   * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
+   * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
+   * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE 
+   * FOR ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED 
+   * WARRANTY.
+   *
+   * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT
+   * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN
+   * ADDITION TO THAT SET FORTH ABOVE.
+   *
+   * Permission to use, copy, modify, and distribute this software and its
+   * documentation for any purpose and without fee is hereby granted, 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 Digital Equipment Corporation not be
+   * used in advertising or publicity pertaining to distribution of the 
+   * software without specific, written prior permission.
+   \*/
+
+/***====================================================================***/
+
+#include       <stdio.h>
+#include       <X11/Xos.h>
+#include       <X11/Xfuncproto.h>
+#include       <X11/Xfuncs.h>
+
+#include <stddef.h>
+#include "config.h"
+
+#ifndef NUL
+#define        NUL     '\0'
+#endif
+
+/***====================================================================***/
+
+#ifndef OPAQUE_DEFINED
+typedef void *Opaque;
+#endif
+#ifndef NullOpaque
+#define        NullOpaque      ((Opaque)NULL)
+#endif
+
+#ifndef BOOLEAN_DEFINED
+typedef char Boolean;
+#endif
+
+#ifndef True
+#define        True    ((Boolean)1)
+#define        False   ((Boolean)0)
+#endif /* ndef True */
+#define        booleanText(b)  ((b)?"True":"False")
+
+#ifndef COMPARISON_DEFINED
+typedef int Comparison;
+
+#define        Greater         ((Comparison)1)
+#define        Equal           ((Comparison)0)
+#define        Less            ((Comparison)-1)
+#define        CannotCompare   ((Comparison)-37)
+#define        comparisonText(c)       ((c)?((c)<0?"Less":"Greater"):"Equal")
+#endif
+
+/***====================================================================***/
+
+extern Opaque uAlloc(unsigned   /* size */
+    );
+extern Opaque uCalloc(unsigned /* n */ ,
+                      unsigned  /* size */
+    );
+extern Opaque uRealloc(Opaque /* old */ ,
+                       unsigned /* newSize */
+    );
+extern Opaque uRecalloc(Opaque /* old */ ,
+                        unsigned /* nOld */ ,
+                        unsigned /* nNew */ ,
+                        unsigned        /* newSize */
+    );
+extern void uFree(Opaque        /* ptr */
+    );
+
+#define        uTypedAlloc(t)          ((t *)uAlloc((unsigned)sizeof(t)))
+#define        uTypedCalloc(n,t)       ((t *)uCalloc((unsigned)n,(unsigned)sizeof(t)))
+#define        uTypedRealloc(pO,n,t)   ((t *)uRealloc((Opaque)pO,((unsigned)n)*sizeof(t)))
+#define        uTypedRecalloc(pO,o,n,t) ((t *)uRecalloc((Opaque)pO,((unsigned)o),((unsigned)n),sizeof(t)))
+#if (defined mdHasAlloca) && (mdHasAlloca)
+#define        uTmpAlloc(n)    ((Opaque)alloca((unsigned)n))
+#define        uTmpFree(p)
+#else
+#define        uTmpAlloc(n)    uAlloc(n)
+#define        uTmpFree(p)     uFree(p)
+#endif
+
+/***====================================================================***/
+
+extern Boolean uSetErrorFile(char *     /* name */
+    );
+
+#define INFO6                  uInformation
+#define INFO5                  uInformation
+#define INFO4                  uInformation
+#define INFO3                  uInformation
+#define INFO2                  uInformation
+#define INFO1                  uInformation
+#define INFO                   uInformation
+
+extern void
+uInformation(const char * /* s */ , ...
+    ) _X_ATTRIBUTE_PRINTF(1, 2);
+
+#define ACTION6                        uAction
+#define ACTION5                        uAction
+#define ACTION4                        uAction
+#define ACTION3                        uAction
+#define ACTION2                        uAction
+#define ACTION1                        uAction
+#define ACTION                 uAction
+
+     extern void uAction(const char * /* s  */ , ...
+    ) _X_ATTRIBUTE_PRINTF(1, 2);
+
+#define WARN6                  uWarning
+#define WARN5                  uWarning
+#define WARN4                  uWarning
+#define WARN3                  uWarning
+#define WARN2                  uWarning
+#define WARN1                  uWarning
+#define WARN                   uWarning
+
+     extern void uWarning(const char * /* s  */ , ...
+    ) _X_ATTRIBUTE_PRINTF(1, 2);
+
+#define ERROR6                 uError
+#define ERROR5                 uError
+#define ERROR4                 uError
+#define ERROR3                 uError
+#define ERROR2                 uError
+#define ERROR1                 uError
+#define ERROR                  uError
+
+     extern void uError(const char * /* s  */ , ...
+    ) _X_ATTRIBUTE_PRINTF(1, 2);
+
+#define FATAL6                 uFatalError
+#define FATAL5                 uFatalError
+#define FATAL4                 uFatalError
+#define FATAL3                 uFatalError
+#define FATAL2                 uFatalError
+#define FATAL1                 uFatalError
+#define FATAL                  uFatalError
+
+     extern void uFatalError(const char * /* s  */ , ...
+    ) _X_ATTRIBUTE_PRINTF(1, 2) _X_NORETURN;
+
+/* WSGO stands for "Weird Stuff Going On" */
+#define WSGO6                  uInternalError
+#define WSGO5                  uInternalError
+#define WSGO4                  uInternalError
+#define WSGO3                  uInternalError
+#define WSGO2                  uInternalError
+#define WSGO1                  uInternalError
+#define WSGO                   uInternalError
+
+     extern void uInternalError(const char * /* s  */ , ...
+    ) _X_ATTRIBUTE_PRINTF(1, 2);
+
+     extern void uSetPreErrorMessage(char *     /* msg */
+    );
+
+     extern void uSetPostErrorMessage(char *    /* msg */
+    );
+
+     extern void uSetErrorPrefix(char * /* void */
+    );
+
+     extern void uFinishUp(void);
+
+
+/***====================================================================***/
+
+#define        NullString      ((char *)NULL)
+
+#define        uStringText(s)          ((s)==NullString?"<NullString>":(s))
+#define        uStringEqual(s1,s2)     (uStringCompare(s1,s2)==Equal)
+#define        uStringPrefix(p,s)      (strncmp(p,s,strlen(p))==0)
+#define        uStringCompare(s1,s2)   (((s1)==NullString||(s2)==NullString)?\
+                                 (s1)!=(s2):strcmp(s1,s2))
+#define        uStrCaseEqual(s1,s2)    (uStrCaseCmp(s1,s2)==0)
+#ifdef HAVE_STRCASECMP
+#include <strings.h>
+#define        uStrCaseCmp(s1,s2)      (strcasecmp(s1,s2))
+#define        uStrCasePrefix(p,s)     (strncasecmp(p,s,strlen(p))==0)
+#else
+     extern int uStrCaseCmp(const char * /* s1 */ ,
+                            const char *        /* s2 */
+    );
+     extern int uStrCasePrefix(const char * /* p */ ,
+                               char *   /* str */
+    );
+#endif
+#ifdef HAVE_STRDUP
+#include <string.h>
+#define        uStringDup(s1)          ((s1) ? strdup(s1) : NULL)
+#else
+     extern char *uStringDup(const char *       /* s1 */
+    );
+#endif
+
+/***====================================================================***/
+
+#ifdef ASSERTIONS_ON
+#define        uASSERT(where,why) \
+       {if (!(why)) uFatalError("assertion botched in %s ( why )\n",where);}
+#else
+#define        uASSERT(where,why)
+#endif
+
+/***====================================================================***/
+
+#ifndef DEBUG_VAR
+#define        DEBUG_VAR       debugFlags
+#endif
+
+extern
+     unsigned int DEBUG_VAR;
+
+     extern void uDebug(char * /* s  */ , ...
+    ) _X_ATTRIBUTE_PRINTF(1, 2);
+
+     extern void uDebugNOI(     /* no indent */
+                              char * /* s  */ , ...
+    ) _X_ATTRIBUTE_PRINTF(1, 2);
+
+     extern Boolean uSetDebugFile(char *name);
+
+     extern FILE *uDebugFile;
+     extern int uDebugIndentLevel;
+     extern int uDebugIndentSize;
+#define        uDebugIndent(l)         (uDebugIndentLevel+=(l))
+#define        uDebugOutdent(l)        (uDebugIndentLevel-=(l))
+#ifdef DEBUG_ON
+#define        uDEBUG(f,s)             { if (DEBUG_VAR&(f)) uDebug(s);}
+#define        uDEBUG1(f,s,a)          { if (DEBUG_VAR&(f)) uDebug(s,a);}
+#define        uDEBUG2(f,s,a,b)        { if (DEBUG_VAR&(f)) uDebug(s,a,b);}
+#define        uDEBUG3(f,s,a,b,c)      { if (DEBUG_VAR&(f)) uDebug(s,a,b,c);}
+#define        uDEBUG4(f,s,a,b,c,d)    { if (DEBUG_VAR&(f)) uDebug(s,a,b,c,d);}
+#define        uDEBUG5(f,s,a,b,c,d,e)  { if (DEBUG_VAR&(f)) uDebug(s,a,b,c,d,e);}
+#define        uDEBUG_NOI(f,s)         { if (DEBUG_VAR&(f)) uDebug(s);}
+#define        uDEBUG_NOI1(f,s,a)      { if (DEBUG_VAR&(f)) uDebugNOI(s,a);}
+#define        uDEBUG_NOI2(f,s,a,b)    { if (DEBUG_VAR&(f)) uDebugNOI(s,a,b);}
+#define        uDEBUG_NOI3(f,s,a,b,c)  { if (DEBUG_VAR&(f)) uDebugNOI(s,a,b,c);}
+#define        uDEBUG_NOI4(f,s,a,b,c,d) { if (DEBUG_VAR&(f)) uDebugNOI(s,a,b,c,d);}
+#define        uDEBUG_NOI5(f,s,a,b,c,d,e) { if (DEBUG_VAR&(f)) uDebugNOI(s,a,b,c,d,e);}
+#else
+#define        uDEBUG(f,s)
+#define        uDEBUG1(f,s,a)
+#define        uDEBUG2(f,s,a,b)
+#define        uDEBUG3(f,s,a,b,c)
+#define        uDEBUG4(f,s,a,b,c,d)
+#define        uDEBUG5(f,s,a,b,c,d,e)
+#define        uDEBUG_NOI(f,s)
+#define        uDEBUG_NOI1(f,s,a)
+#define        uDEBUG_NOI2(f,s,a,b)
+#define        uDEBUG_NOI3(f,s,a,b,c)
+#define        uDEBUG_NOI4(f,s,a,b,c,d)
+#define        uDEBUG_NOI5(f,s,a,b,c,d,e)
+#endif
+
+     extern Boolean uSetEntryFile(char *name);
+     extern void uEntry(int /* l */ ,
+                        char * /* s  */ , ...
+    ) _X_ATTRIBUTE_PRINTF(2, 3);
+
+     extern void uExit(int l, char *rtVal);
+#ifdef ENTRY_TRACKING_ON
+#define        ENTRY_BIT       0x10
+#define        LOW_ENTRY_BIT   0x1000
+#define        ENTER   (DEBUG_VAR&ENTRY_BIT)
+#define        FLAG(fLag)      (DEBUG_VAR&(fLag))
+
+     extern int uEntryLevel;
+
+#define        uENTRY(s)                       { if (ENTER) uEntry(1,s);}
+#define        uENTRY1(s,a)                    { if (ENTER) uEntry(1,s,a);}
+#define        uENTRY2(s,a,b)                  { if (ENTER) uEntry(1,s,a,b);}
+#define        uENTRY3(s,a,b,c)                { if (ENTER) uEntry(1,s,a,b,c);}
+#define        uENTRY4(s,a,b,c,d)              { if (ENTER) uEntry(1,s,a,b,c,d);}
+#define        uENTRY5(s,a,b,c,d,e)            { if (ENTER) uEntry(1,s,a,b,c,d,e);}
+#define        uENTRY6(s,a,b,c,d,e,f)          { if (ENTER) uEntry(1,s,a,b,c,d,e,f);}
+#define        uENTRY7(s,a,b,c,d,e,f,g)        { if (ENTER) uEntry(1,s,a,b,c,d,e,f,g);}
+#define        uRETURN(v)                      { if (ENTER) uEntryLevel--; return(v); }
+#define        uVOIDRETURN                     { if (ENTER) uEntryLevel--; return; }
+
+#define        uFLAG_ENTRY(w,s)                { if (FLAG(w)) uEntry(0,s);}
+#define        uFLAG_ENTRY1(w,s,a)             { if (FLAG(w)) uEntry(0,s,a);}
+#define        uFLAG_ENTRY2(w,s,a,b)           { if (FLAG(w)) uEntry(0,s,a,b);}
+#define        uFLAG_ENTRY3(w,s,a,b,c)         { if (FLAG(w)) uEntry(0,s,a,b,c);}
+#define        uFLAG_ENTRY4(w,s,a,b,c,d)       { if (FLAG(w)) uEntry(0,s,a,b,c,d);}
+#define        uFLAG_ENTRY5(w,s,a,b,c,d,e)     { if (FLAG(w)) uEntry(0,s,a,b,c,d,e);}
+#define        uFLAG_ENTRY6(w,s,a,b,c,d,e,f)   { if (FLAG(w)) uEntry(0,s,a,b,c,d,e,f);}
+#define        uFLAG_ENTRY7(w,s,a,b,c,d,e,f,g) { if(FLAG(w))uEntry(0,s,a,b,c,d,e,f,g);}
+#define        uFLAG_RETURN(v)                 { return(v);}
+#define        uFLAG_VOIDRETURN                { return; }
+#else
+#define        uENTRY(s)
+#define        uENTRY1(s,a)
+#define        uENTRY2(s,a1,a2)
+#define        uENTRY3(s,a1,a2,a3)
+#define        uENTRY4(s,a1,a2,a3,a4)
+#define        uENTRY5(s,a1,a2,a3,a4,a5)
+#define        uENTRY6(s,a1,a2,a3,a4,a5,a6)
+#define        uENTRY7(s,a1,a2,a3,a4,a5,a6,a7)
+#define        uRETURN(v)      { return(v); }
+#define        uVOIDRETURN     { return; }
+
+#define        uFLAG_ENTRY(f,s)
+#define        uFLAG_ENTRY1(f,s,a)
+#define        uFLAG_ENTRY2(f,s,a,b)
+#define        uFLAG_ENTRY3(f,s,a,b,c)
+#define        uFLAG_ENTRY4(f,s,a,b,c,d)
+#define        uFLAG_ENTRY5(f,s,a,b,c,d,e)
+#define        uFLAG_ENTRY6(f,s,a,b,c,d,e,g)
+#define        uFLAG_ENTRY7(f,s,a,b,c,d,e,g,h)
+#define        uFLAG_RETURN(v)                 { return(v);}
+#define        uFLAG_VOIDRETURN                { return; }
+#endif
+
+
+#endif /* UTILS_H */
diff --git a/vmod.c b/vmod.c
new file mode 100644 (file)
index 0000000..5578fd0
--- /dev/null
+++ b/vmod.c
@@ -0,0 +1,271 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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.
+
+ ********************************************************/
+
+#define        DEBUG_VAR debugFlags
+#include <stdio.h>
+#include "xkbcomp.h"
+#include "tokens.h"
+#include "expr.h"
+#include "misc.h"
+
+#include <X11/extensions/XKB.h>
+#include <X11/extensions/XKBstr.h>
+
+#include "vmod.h"
+
+void
+InitVModInfo(VModInfo * info, XkbDescPtr xkb)
+{
+    ClearVModInfo(info, xkb);
+    info->errorCount = 0;
+    return;
+}
+
+void
+ClearVModInfo(VModInfo * info, XkbDescPtr xkb)
+{
+    register int i;
+
+    if (XkbAllocNames(xkb, XkbVirtualModNamesMask, 0, 0) != Success)
+        return;
+    if (XkbAllocServerMap(xkb, XkbVirtualModsMask, 0) != Success)
+        return;
+    info->xkb = xkb;
+    info->newlyDefined = info->defined = info->available = 0;
+    if (xkb && xkb->names)
+    {
+        register int bit;
+        for (i = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1)
+        {
+            if (xkb->names->vmods[i] != None)
+                info->defined |= bit;
+        }
+    }
+    return;
+}
+
+/***====================================================================***/
+
+/**
+ * Handle one entry in the virtualModifiers line (e.g. NumLock).
+ * If the entry is e.g. NumLock=Mod1, stmt->value is not NULL, and the
+ * XkbServerMap's vmod is set to the given modifier. Otherwise, the vmod is 0.
+ *
+ * @param stmt The statement specifying the name and (if any the value).
+ * @param mergeMode Merge strategy (e.g. MergeOverride)
+ */
+Bool
+HandleVModDef(VModDef * stmt, unsigned mergeMode, VModInfo * info)
+{
+    register int i, bit, nextFree;
+    ExprResult mod;
+    XkbServerMapPtr srv;
+    XkbNamesPtr names;
+    Atom stmtName;
+
+    srv = info->xkb->server;
+    names = info->xkb->names;
+    stmtName =
+        XkbInternAtom(info->xkb->dpy, XkbAtomGetString(NULL, stmt->name),
+                      False);
+    for (i = 0, bit = 1, nextFree = -1; i < XkbNumVirtualMods; i++, bit <<= 1)
+    {
+        if (info->defined & bit)
+        {
+            if (names->vmods[i] == stmtName)
+            {                   /* already defined */
+                info->available |= bit;
+                if (stmt->value == NULL)
+                    return True;
+                else
+                {
+                    char *str1;
+                    const char *str2 = "";
+                    if (!ExprResolveModMask(stmt->value, &mod, NULL, NULL))
+                    {
+                        str1 = XkbAtomText(NULL, stmt->name, XkbMessage);
+                        ACTION1("Declaration of %s ignored\n", str1);
+                        return False;
+                    }
+                    if (mod.uval == srv->vmods[i])
+                        return True;
+
+                    str1 = XkbAtomText(NULL, stmt->name, XkbMessage);
+                    WARN1("Virtual modifier %s multiply defined\n", str1);
+                    str1 = XkbModMaskText(srv->vmods[i], XkbCFile);
+                    if (mergeMode == MergeOverride)
+                    {
+                        str2 = str1;
+                        str1 = XkbModMaskText(mod.uval, XkbCFile);
+                    }
+                    ACTION2("Using %s, ignoring %s\n", str1, str2);
+                    if (mergeMode == MergeOverride)
+                        srv->vmods[i] = mod.uval;
+                    return True;
+                }
+            }
+        }
+        else if (nextFree < 0)
+            nextFree = i;
+    }
+    if (nextFree < 0)
+    {
+        ERROR1("Too many virtual modifiers defined (maximum %d)\n",
+               XkbNumVirtualMods);
+        ACTION("Exiting\n");
+        return False;
+    }
+    info->defined |= (1 << nextFree);
+    info->newlyDefined |= (1 << nextFree);
+    info->available |= (1 << nextFree);
+    names->vmods[nextFree] = stmtName;
+    if (stmt->value == NULL)
+        return True;
+    if (ExprResolveModMask(stmt->value, &mod, NULL, NULL))
+    {
+        srv->vmods[nextFree] = mod.uval;
+        return True;
+    }
+    ACTION1("Declaration of %s ignored\n",
+            XkbAtomText(NULL, stmt->name, XkbMessage));
+    return False;
+}
+
+/**
+ * Returns the index of the given modifier in the xkb->names->vmods array.
+ *
+ * @param priv Pointer to the xkb data structure.
+ * @param elem Must be None, otherwise return False.
+ * @param field The Atom of the modifier's name (e.g. Atom for LAlt)
+ * @param type Must be TypeInt, otherwise return False.
+ * @param val_rtrn Set to the index of the modifier that matches.
+ *
+ * @return True on success, False otherwise. If False is returned, val_rtrn is
+ * undefined.
+ */
+int
+LookupVModIndex(XPointer priv,
+                Atom elem, Atom field, unsigned type, ExprResult * val_rtrn)
+{
+    register int i;
+    register char *fieldStr;
+    register char *modStr;
+    XkbDescPtr xkb;
+
+    xkb = (XkbDescPtr) priv;
+    if ((xkb == NULL) || (xkb->names == NULL) || (elem != None)
+        || (type != TypeInt))
+    {
+        return False;
+    }
+    /* get the actual name */
+    fieldStr = XkbAtomGetString(xkb->dpy, field);
+    if (fieldStr == NULL)
+        return False;
+    /* For each named modifier, get the name and compare it to the one passed
+     * in. If we get a match, return the index of the modifier.
+     * The order of modifiers is the same as in the virtual_modifiers line in
+     * the xkb_types section.
+     */
+    for (i = 0; i < XkbNumVirtualMods; i++)
+    {
+        modStr = XkbAtomGetString(xkb->dpy, xkb->names->vmods[i]);
+        if ((modStr != NULL) && (uStrCaseCmp(fieldStr, modStr) == 0))
+        {
+            val_rtrn->uval = i;
+            return True;
+        }
+    }
+    return False;
+}
+
+/**
+ * Get the mask for the given modifier and set val_rtrn.uval to the mask.
+ * Note that the mask returned is always > 512.
+ *
+ * @param priv Pointer to xkb data structure.
+ * @param val_rtrn Set to the mask returned.
+ *
+ * @return True on success, False otherwise. If False is returned, val_rtrn is
+ * undefined.
+ */
+int
+LookupVModMask(XPointer priv,
+               Atom elem, Atom field, unsigned type, ExprResult * val_rtrn)
+{
+    if (LookupVModIndex(priv, elem, field, type, val_rtrn))
+    {
+        register unsigned ndx = val_rtrn->uval;
+        val_rtrn->uval = (1 << (XkbNumModifiers + ndx));
+        return True;
+    }
+    return False;
+}
+
+int
+FindKeypadVMod(XkbDescPtr xkb)
+{
+    Atom name;
+    ExprResult rtrn;
+
+    name = XkbInternAtom(xkb->dpy, "NumLock", False);
+    if ((xkb) && LookupVModIndex((XPointer) xkb, None, name, TypeInt, &rtrn))
+    {
+        return rtrn.ival;
+    }
+    return -1;
+}
+
+Bool
+ResolveVirtualModifier(ExprDef * def, ExprResult * val_rtrn, VModInfo * info)
+{
+    XkbNamesPtr names;
+
+    names = info->xkb->names;
+    if (def->op == ExprIdent)
+    {
+        register int i, bit;
+        for (i = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1)
+        {
+            char *str1, *str2;
+            str1 = XkbAtomGetString(info->xkb->dpy, names->vmods[i]);
+            str2 = XkbAtomGetString(NULL, def->value.str);
+            if ((info->available & bit) && (uStrCaseCmp(str1, str2) == Equal))
+            {
+                val_rtrn->uval = i;
+                return True;
+            }
+        }
+    }
+    if (ExprResolveInteger(def, val_rtrn, NULL, NULL))
+    {
+        if (val_rtrn->uval < XkbNumVirtualMods)
+            return True;
+        ERROR2("Illegal virtual modifier %d (must be 0..%d inclusive)\n",
+               val_rtrn->uval, XkbNumVirtualMods - 1);
+    }
+    return False;
+}
diff --git a/vmod.h b/vmod.h
new file mode 100644 (file)
index 0000000..559b9d5
--- /dev/null
+++ b/vmod.h
@@ -0,0 +1,78 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 VMOD_H
+#define VMOD_H 1
+
+typedef struct _VModInfo
+{
+    XkbDescPtr xkb;
+    unsigned defined;
+    unsigned available;
+    unsigned newlyDefined;
+    int errorCount;
+} VModInfo;
+
+extern void InitVModInfo(VModInfo * /* info */ ,
+                         XkbDescPtr     /* xkb */
+    );
+
+extern void ClearVModInfo(VModInfo * /* info */ ,
+                          XkbDescPtr    /* xkb */
+    );
+
+extern Bool HandleVModDef(VModDef * /* stmt */ ,
+                          unsigned /* mergeMode */ ,
+                          VModInfo *    /* info */
+    );
+
+extern Bool ApplyVModDefs(VModInfo * /* info */ ,
+                          XkbDescPtr    /* xkb */
+    );
+
+extern int LookupVModIndex(XPointer /* priv */ ,
+                           Atom /* elem */ ,
+                           Atom /* field */ ,
+                           unsigned /* type */ ,
+                           ExprResult * /* val_rtrn */
+    );
+
+extern int LookupVModMask(XPointer /* priv */ ,
+                          Atom /* elem */ ,
+                          Atom /* field */ ,
+                          unsigned /* type */ ,
+                          ExprResult *  /* val_rtrn */
+    );
+
+extern int FindKeypadVMod(XkbDescPtr    /* xkb */
+    );
+
+extern Bool ResolveVirtualModifier(ExprDef * /* def */ ,
+                                   ExprResult * /* value_rtrn */ ,
+                                   VModInfo *   /* info */
+    );
+
+#endif /* VMOD_H */
diff --git a/xkbcomp.c b/xkbcomp.c
new file mode 100644 (file)
index 0000000..063ae87
--- /dev/null
+++ b/xkbcomp.c
@@ -0,0 +1,1229 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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>
+#include <ctype.h>
+#include <X11/keysym.h>
+
+/* for symlink attack security fix -- Branden Robinson */
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+/* end BR */
+
+#if defined(sgi)
+#include <malloc.h>
+#endif
+
+#define        DEBUG_VAR debugFlags
+#include "xkbcomp.h"
+#include <stdlib.h>
+#include "xkbpath.h"
+#include "parseutils.h"
+#include "misc.h"
+#include "tokens.h"
+#include <X11/extensions/XKBgeom.h>
+
+#ifdef __UNIXOS2__
+#define chdir _chdir2
+#endif
+
+#ifdef WIN32
+#define S_IRGRP 0
+#define S_IWGRP 0
+#define S_IROTH 0
+#define S_IWOTH 0
+#endif
+
+#define        lowbit(x)       ((x) & (-(x)))
+
+/***====================================================================***/
+
+#define        WANT_DEFAULT    0
+#define        WANT_XKM_FILE   1
+#define        WANT_C_HDR      2
+#define        WANT_XKB_FILE   3
+#define        WANT_X_SERVER   4
+#define        WANT_LISTING    5
+
+#define        INPUT_UNKNOWN   0
+#define        INPUT_XKB       1
+#define        INPUT_XKM       2
+
+unsigned int debugFlags;
+
+static const char *fileTypeExt[] = {
+    "XXX",
+    "xkm",
+    "h",
+    "xkb",
+    "dir"
+};
+
+static unsigned inputFormat, outputFormat;
+char *rootDir;
+static char *inputFile;
+static char *inputMap;
+static char *outputFile;
+static char *inDpyName;
+static char *outDpyName;
+static Display *inDpy;
+static Display *outDpy;
+static Bool showImplicit = False;
+static Bool synch = False;
+static Bool computeDflts = False;
+static Bool xkblist = False;
+unsigned warningLevel = 5;
+unsigned verboseLevel = 0;
+unsigned dirsToStrip = 0;
+unsigned optionalParts = 0;
+static char *preErrorMsg = NULL;
+static char *postErrorMsg = NULL;
+static char *errorPrefix = NULL;
+static unsigned int device_id = XkbUseCoreKbd;
+
+/***====================================================================***/
+
+#define        M(m)    fprintf(stderr,(m))
+#define        M1(m,a) fprintf(stderr,(m),(a))
+
+static void
+Usage(int argc, char *argv[])
+{
+    if (!xkblist)
+        M1("Usage: %s [options] input-file [ output-file ]\n", argv[0]);
+    else
+        M1("Usage: %s [options] file[(map)] ...\n", argv[0]);
+    M("Legal options:\n");
+    M("-?,-help             Print this message\n");
+    M("-version             Print the version number\n");
+    if (!xkblist)
+    {
+        M("-a                   Show all actions\n");
+        M("-C                   Create a C header file\n");
+    }
+#ifdef DEBUG
+    M("-d [flags]           Report debugging information\n");
+#endif
+    M("-em1 <msg>           Print <msg> before printing first error message\n");
+    M("-emp <msg>           Print <msg> at the start of each message line\n");
+    M("-eml <msg>           If there were any errors, print <msg> before exiting\n");
+    if (!xkblist)
+    {
+        M("-dflts               Compute defaults for missing parts\n");
+        M("-I[<dir>]            Specifies a top level directory for include\n");
+        M("                     directives. Multiple directories are legal.\n");
+        M("-l [flags]           List matching maps in the specified files\n");
+        M("                     f: list fully specified names\n");
+        M("                     h: also list hidden maps\n");
+        M("                     l: long listing (show flags)\n");
+        M("                     p: also list partial maps\n");
+        M("                     R: recursively list subdirectories\n");
+        M("                     default is all options off\n");
+    }
+    M("-i <deviceid>        Specifies device ID (not name) to compile for\n");
+    M("-m[ap] <map>         Specifies map to compile\n");
+    M("-o <file>            Specifies output file name\n");
+    if (!xkblist)
+    {
+        M("-opt[ional] <parts>  Specifies optional components of keymap\n");
+        M("                     Errors in optional parts are not fatal\n");
+        M("                     <parts> can be any combination of:\n");
+        M("                     c: compat map         g: geometry\n");
+        M("                     k: keycodes           s: symbols\n");
+        M("                     t: types\n");
+    }
+    if (xkblist)
+    {
+        M("-p <count>           Specifies the number of slashes to be stripped\n");
+        M("                     from the front of the map name on output\n");
+    }
+    M("-R[<DIR>]            Specifies the root directory for\n");
+    M("                     relative path names\n");
+    M("-synch               Force synchronization\n");
+    if (xkblist)
+    {
+        M("-v [<flags>]         Set level of detail for listing.\n");
+        M("                     flags are as for the -l option\n");
+    }
+    M("-w [<lvl>]           Set warning level (0=none, 10=all)\n");
+    if (!xkblist)
+    {
+        M("-xkb                 Create an XKB source (.xkb) file\n");
+        M("-xkm                 Create a compiled key map (.xkm) file\n");
+    }
+    return;
+}
+
+/***====================================================================***/
+
+static void
+setVerboseFlags(char *str)
+{
+    for (; *str; str++)
+    {
+        switch (*str)
+        {
+        case 'f':
+            verboseLevel |= WantFullNames;
+            break;
+        case 'h':
+            verboseLevel |= WantHiddenMaps;
+            break;
+        case 'l':
+            verboseLevel |= WantLongListing;
+            break;
+        case 'p':
+            verboseLevel |= WantPartialMaps;
+            break;
+        case 'R':
+            verboseLevel |= ListRecursive;
+            break;
+        default:
+            if (warningLevel > 4)
+            {
+                WARN1("Unknown verbose option \"%c\"\n", (unsigned int) *str);
+                ACTION("Ignored\n");
+            }
+            break;
+        }
+    }
+    return;
+}
+
+static Bool
+parseArgs(int argc, char *argv[])
+{
+    register int i, tmp;
+
+    i = strlen(argv[0]);
+    tmp = strlen("xkblist");
+    if ((i >= tmp) && (strcmp(&argv[0][i - tmp], "xkblist") == 0))
+    {
+        xkblist = True;
+    }
+    for (i = 1; i < argc; i++)
+    {
+        int itmp;
+        if ((argv[i][0] != '-') || (uStringEqual(argv[i], "-")))
+        {
+            if (!xkblist)
+            {
+                if (inputFile == NULL)
+                    inputFile = argv[i];
+                else if (outputFile == NULL)
+                    outputFile = argv[i];
+                else if (warningLevel > 0)
+                {
+                    WARN("Too many file names on command line\n");
+                    ACTION3
+                        ("Compiling %s, writing to %s, ignoring %s\n",
+                         inputFile, outputFile, argv[i]);
+                }
+            }
+            else if (!AddMatchingFiles(argv[i]))
+                return False;
+        }
+        else if ((strcmp(argv[i], "-?") == 0)
+                 || (strcmp(argv[i], "-help") == 0))
+        {
+            Usage(argc, argv);
+            exit(0);
+        }
+        else if (strcmp(argv[i], "-version") == 0)
+        {
+            printf("xkbcomp %s\n", PACKAGE_VERSION);
+            exit(0);
+        } else if ((strcmp(argv[i], "-a") == 0) && (!xkblist))
+        {
+            showImplicit = True;
+        }
+        else if ((strcmp(argv[i], "-C") == 0) && (!xkblist))
+        {
+            if ((outputFormat != WANT_DEFAULT)
+                && (outputFormat != WANT_C_HDR))
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("Multiple output file formats specified\n");
+                    ACTION1("\"%s\" flag ignored\n", argv[i]);
+                }
+            }
+            else
+                outputFormat = WANT_C_HDR;
+        }
+#ifdef DEBUG
+        else if (strcmp(argv[i], "-d") == 0)
+        {
+            if ((i >= (argc - 1)) || (!isdigit(argv[i + 1][0])))
+            {
+                debugFlags = 1;
+            }
+            else
+            {
+                if (sscanf(argv[++i], "%i", &itmp) == 1)
+                    debugFlags = itmp;
+            }
+            INFO1("Setting debug flags to %d\n", debugFlags);
+        }
+#endif
+        else if ((strcmp(argv[i], "-dflts") == 0) && (!xkblist))
+        {
+            computeDflts = True;
+        }
+        else if (strcmp(argv[i], "-em1") == 0)
+        {
+            if (++i >= argc)
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("No pre-error message specified\n");
+                    ACTION("Trailing \"-em1\" option ignored\n");
+                }
+            }
+            else if (preErrorMsg != NULL)
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("Multiple pre-error messsages specified\n");
+                    ACTION2("Compiling %s, ignoring %s\n",
+                            preErrorMsg, argv[i]);
+                }
+            }
+            else
+                preErrorMsg = argv[i];
+        }
+        else if (strcmp(argv[i], "-emp") == 0)
+        {
+            if (++i >= argc)
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("No error prefix specified\n");
+                    ACTION("Trailing \"-emp\" option ignored\n");
+                }
+            }
+            else if (errorPrefix != NULL)
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("Multiple error prefixes specified\n");
+                    ACTION2("Compiling %s, ignoring %s\n",
+                            errorPrefix, argv[i]);
+                }
+            }
+            else
+                errorPrefix = argv[i];
+        }
+        else if (strcmp(argv[i], "-eml") == 0)
+        {
+            if (++i >= argc)
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("No post-error message specified\n");
+                    ACTION("Trailing \"-eml\" option ignored\n");
+                }
+            }
+            else if (postErrorMsg != NULL)
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("Multiple post-error messages specified\n");
+                    ACTION2("Compiling %s, ignoring %s\n",
+                            postErrorMsg, argv[i]);
+                }
+            }
+            else
+                postErrorMsg = argv[i];
+        }
+        else if ((strncmp(argv[i], "-I", 2) == 0) && (!xkblist))
+        {
+            if (!XkbAddDirectoryToPath(&argv[i][2]))
+            {
+                ACTION("Exiting\n");
+                exit(1);
+            }
+        }
+        else if ((strncmp(argv[i], "-i", 2) == 0) && (!xkblist))
+        {
+            if (++i >= argc)
+            {
+                if (warningLevel > 0)
+                    WARN("No device ID specified\n");
+            }
+            device_id = atoi(argv[i]);
+        }
+        else if ((strncmp(argv[i], "-l", 2) == 0) && (!xkblist))
+        {
+            if (outputFormat != WANT_DEFAULT)
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("Multiple output file formats specified\n");
+                    ACTION1("\"%s\" flag ignored\n", argv[i]);
+                }
+            }
+            else
+            {
+                if (argv[i][2] != '\0')
+                    setVerboseFlags(&argv[i][2]);
+                xkblist = True;
+                if ((inputFile) && (!AddMatchingFiles(inputFile)))
+                    return False;
+                else
+                    inputFile = NULL;
+                if ((outputFile) && (!AddMatchingFiles(outputFile)))
+                    return False;
+                else
+                    outputFile = NULL;
+            }
+        }
+        else if ((strcmp(argv[i], "-m") == 0)
+                 || (strcmp(argv[i], "-map") == 0))
+        {
+            if (++i >= argc)
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("No map name specified\n");
+                    ACTION1("Trailing \"%s\" option ignored\n", argv[i - 1]);
+                }
+            }
+            else if (xkblist)
+            {
+                if (!AddMapOnly(argv[i]))
+                    return False;
+            }
+            else if (inputMap != NULL)
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("Multiple map names specified\n");
+                    ACTION2("Compiling %s, ignoring %s\n", inputMap, argv[i]);
+                }
+            }
+            else
+                inputMap = argv[i];
+        }
+        else if ((strcmp(argv[i], "-merge") == 0) && (!xkblist))
+        {
+            /* Ignored */
+        }
+        else if (strcmp(argv[i], "-o") == 0)
+        {
+            if (++i >= argc)
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("No output file specified\n");
+                    ACTION("Trailing \"-o\" option ignored\n");
+                }
+            }
+            else if (outputFile != NULL)
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("Multiple output files specified\n");
+                    ACTION2("Compiling %s, ignoring %s\n", outputFile,
+                            argv[i]);
+                }
+            }
+            else
+                outputFile = argv[i];
+        }
+        else if (((strcmp(argv[i], "-opt") == 0)
+                  || (strcmp(argv[i], "optional") == 0)) && (!xkblist))
+        {
+            if (++i >= argc)
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("No optional components specified\n");
+                    ACTION1("Trailing \"%s\" option ignored\n", argv[i - 1]);
+                }
+            }
+            else
+            {
+                char *tmp2;
+                for (tmp2 = argv[i]; (*tmp2 != '\0'); tmp2++)
+                {
+                    switch (*tmp2)
+                    {
+                    case 'c':
+                    case 'C':
+                        optionalParts |= XkmCompatMapMask;
+                        break;
+                    case 'g':
+                    case 'G':
+                        optionalParts |= XkmGeometryMask;
+                        break;
+                    case 'k':
+                    case 'K':
+                        optionalParts |= XkmKeyNamesMask;
+                        break;
+                    case 's':
+                    case 'S':
+                        optionalParts |= XkmSymbolsMask;
+                        break;
+                    case 't':
+                    case 'T':
+                        optionalParts |= XkmTypesMask;
+                        break;
+                    default:
+                        if (warningLevel > 0)
+                        {
+                            WARN1
+                                ("Illegal component for %s option\n",
+                                 argv[i - 1]);
+                            ACTION1
+                                ("Ignoring unknown specifier \"%c\"\n",
+                                 (unsigned int) *tmp2);
+                        }
+                        break;
+                    }
+                }
+            }
+        }
+        else if (strncmp(argv[i], "-p", 2) == 0)
+        {
+            if (isdigit(argv[i][2]))
+            {
+                if (sscanf(&argv[i][2], "%i", &itmp) == 1)
+                    dirsToStrip = itmp;
+            }
+            else if ((i < (argc - 1)) && (isdigit(argv[i + 1][0])))
+            {
+                if (sscanf(argv[++i], "%i", &itmp) == 1)
+                    dirsToStrip = itmp;
+            }
+            else
+            {
+                dirsToStrip = 0;
+            }
+            if (warningLevel > 5)
+                INFO1("Setting path count to %d\n", dirsToStrip);
+        }
+        else if (strncmp(argv[i], "-R", 2) == 0)
+        {
+            if (argv[i][2] == '\0')
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("No root directory specified\n");
+                    ACTION("Ignoring -R option\n");
+                }
+            }
+            else if (rootDir != NULL)
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("Multiple root directories specified\n");
+                    ACTION2("Using %s, ignoring %s\n", rootDir, argv[i]);
+                }
+            }
+            else
+            {
+                rootDir = &argv[i][2];
+                if (warningLevel > 8)
+                {
+                    WARN1("Changing root directory to \"%s\"\n", rootDir);
+                }
+                if ((chdir(rootDir) < 0) && (warningLevel > 0))
+                {
+                    WARN1("Couldn't change directory to \"%s\"\n", rootDir);
+                    ACTION("Root directory (-R) option ignored\n");
+                    rootDir = NULL;
+                }
+            }
+        }
+        else if ((strcmp(argv[i], "-synch") == 0)
+                 || (strcmp(argv[i], "-s") == 0))
+        {
+            synch = True;
+        }
+        else if (strncmp(argv[i], "-v", 2) == 0)
+        {
+            char *str;
+            if (argv[i][2] != '\0')
+                str = &argv[i][2];
+            else if ((i < (argc - 1)) && (argv[i + 1][0] != '-'))
+                str = argv[++i];
+            else
+                str = NULL;
+            if (str)
+                setVerboseFlags(str);
+        }
+        else if (strncmp(argv[i], "-w", 2) == 0)
+        {
+            if ((i >= (argc - 1)) || (!isdigit(argv[i + 1][0])))
+            {
+                warningLevel = 0;
+                if (isdigit(argv[i][1]))
+                    if (sscanf(&argv[i][1], "%i", &itmp) == 1)
+                        warningLevel = itmp;
+            }
+            else
+            {
+                if (sscanf(argv[++i], "%i", &itmp) == 1)
+                    warningLevel = itmp;
+            }
+        }
+        else if ((strcmp(argv[i], "-xkb") == 0) && (!xkblist))
+        {
+            if ((outputFormat != WANT_DEFAULT)
+                && (outputFormat != WANT_XKB_FILE))
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("Multiple output file formats specified\n");
+                    ACTION1("\"%s\" flag ignored\n", argv[i]);
+                }
+            }
+            else
+                outputFormat = WANT_XKB_FILE;
+        }
+        else if ((strcmp(argv[i], "-xkm") == 0) && (!xkblist))
+        {
+            if ((outputFormat != WANT_DEFAULT)
+                && (outputFormat != WANT_XKM_FILE))
+            {
+                if (warningLevel > 0)
+                {
+                    WARN("Multiple output file formats specified\n");
+                    ACTION1("\"%s\" flag ignored\n", argv[i]);
+                }
+            }
+            else
+                outputFormat = WANT_XKM_FILE;
+        }
+        else
+        {
+            ERROR1("Unknown flag \"%s\" on command line\n", argv[i]);
+            Usage(argc, argv);
+            return False;
+        }
+    }
+    if (xkblist)
+        inputFormat = INPUT_XKB;
+    else if (inputFile == NULL)
+    {
+        ERROR("No input file specified\n");
+        return False;
+    }
+    else if (uStringEqual(inputFile, "-"))
+    {
+        inputFormat = INPUT_XKB;
+    }
+#ifndef WIN32
+    else if (strchr(inputFile, ':') == NULL)
+    {
+#else
+    else if ((strchr(inputFile, ':') == NULL) || (strlen(inputFile) > 2 &&
+                                               isalpha(inputFile[0]) &&
+                                               inputFile[1] == ':'
+                                               && strchr(inputFile + 2,
+                                                         ':') == NULL))
+    {
+#endif
+        int len;
+        len = strlen(inputFile);
+        if (inputFile[len - 1] == ')')
+        {
+            char *tmpstr;
+            if ((tmpstr = strchr(inputFile, '(')) != NULL)
+            {
+                *tmpstr = '\0';
+                inputFile[len - 1] = '\0';
+                tmpstr++;
+                if (*tmpstr == '\0')
+                {
+                    WARN("Empty map in filename\n");
+                    ACTION("Ignored\n");
+                }
+                else if (inputMap == NULL)
+                {
+                    inputMap = uStringDup(tmpstr);
+                }
+                else
+                {
+                    WARN("Map specified in filename and with -m flag\n");
+                    ACTION1("map from name (\"%s\") ignored\n", tmpstr);
+                }
+            }
+            else
+            {
+                ERROR1("Illegal name \"%s\" for input file\n", inputFile);
+                return False;
+            }
+        }
+        if ((len > 4) && (strcmp(&inputFile[len - 4], ".xkm") == 0))
+        {
+            inputFormat = INPUT_XKM;
+        }
+        else
+        {
+            FILE *file;
+            file = fopen(inputFile, "r");
+            if (file)
+            {
+                if (XkmProbe(file))
+                    inputFormat = INPUT_XKM;
+                else
+                    inputFormat = INPUT_XKB;
+                fclose(file);
+            }
+            else
+            {
+                fprintf(stderr, "Cannot open \"%s\" for reading\n",
+                        inputFile);
+                return False;
+            }
+        }
+    }
+    else
+    {
+        inDpyName = inputFile;
+        inputFile = NULL;
+        inputFormat = INPUT_XKM;
+    }
+
+    if (outputFormat == WANT_DEFAULT)
+    {
+        if (xkblist)
+            outputFormat = WANT_LISTING;
+        else if (inputFormat == INPUT_XKB)
+            outputFormat = WANT_XKM_FILE;
+        else
+            outputFormat = WANT_XKB_FILE;
+    }
+    if ((outputFormat == WANT_LISTING) && (inputFormat != INPUT_XKB))
+    {
+        if (inputFile)
+            ERROR("Cannot generate a listing from a .xkm file (yet)\n");
+        else
+            ERROR("Cannot generate a listing from an X connection (yet)\n");
+        return False;
+    }
+    if (xkblist)
+    {
+        if (outputFile == NULL)
+            outputFile = uStringDup("-");
+        else if (strchr(outputFile, ':') != NULL)
+        {
+            ERROR("Cannot write a listing to an X connection\n");
+            return False;
+        }
+    }
+    else if ((!outputFile) && (inputFile) && uStringEqual(inputFile, "-"))
+    {
+        int len = strlen("stdin") + strlen(fileTypeExt[outputFormat]) + 2;
+        outputFile = uTypedCalloc(len, char);
+        if (outputFile == NULL)
+        {
+            WSGO("Cannot allocate space for output file name\n");
+            ACTION("Exiting\n");
+            exit(1);
+        }
+        sprintf(outputFile, "stdin.%s", fileTypeExt[outputFormat]);
+    }
+    else if ((outputFile == NULL) && (inputFile != NULL))
+    {
+        int len;
+        char *base, *ext;
+
+        if (inputMap == NULL)
+        {
+            base = strrchr(inputFile, '/');
+            if (base == NULL)
+                base = inputFile;
+            else
+                base++;
+        }
+        else
+            base = inputMap;
+
+        len = strlen(base) + strlen(fileTypeExt[outputFormat]) + 2;
+        outputFile = uTypedCalloc(len, char);
+        if (outputFile == NULL)
+        {
+            WSGO("Cannot allocate space for output file name\n");
+            ACTION("Exiting\n");
+            exit(1);
+        }
+        ext = strrchr(base, '.');
+        if (ext == NULL)
+            sprintf(outputFile, "%s.%s", base, fileTypeExt[outputFormat]);
+        else
+        {
+            strcpy(outputFile, base);
+            strcpy(&outputFile[ext - base + 1], fileTypeExt[outputFormat]);
+        }
+    }
+    else if (outputFile == NULL)
+    {
+        int len;
+        char *ch, *name, buf[128];
+        if (inDpyName[0] == ':')
+            snprintf(name = buf, sizeof(buf), "server%s", inDpyName);
+        else
+            name = inDpyName;
+
+        len = strlen(name) + strlen(fileTypeExt[outputFormat]) + 2;
+        outputFile = uTypedCalloc(len, char);
+        if (outputFile == NULL)
+        {
+            WSGO("Cannot allocate space for output file name\n");
+            ACTION("Exiting\n");
+            exit(1);
+        }
+        strcpy(outputFile, name);
+        for (ch = outputFile; (*ch) != '\0'; ch++)
+        {
+            if (*ch == ':')
+                *ch = '-';
+            else if (*ch == '.')
+                *ch = '_';
+        }
+        *ch++ = '.';
+        strcpy(ch, fileTypeExt[outputFormat]);
+    }
+#ifdef WIN32
+    else if (strlen(outputFile) > 2 &&
+             isalpha(outputFile[0]) &&
+             outputFile[1] == ':' && strchr(outputFile + 2, ':') == NULL)
+    {
+    }
+#endif
+    else if (strchr(outputFile, ':') != NULL)
+    {
+        outDpyName = outputFile;
+        outputFile = NULL;
+        outputFormat = WANT_X_SERVER;
+    }
+    return True;
+}
+
+static Display *
+GetDisplay(char *program, char *dpyName)
+{
+    int mjr, mnr, error;
+    Display *dpy;
+
+    mjr = XkbMajorVersion;
+    mnr = XkbMinorVersion;
+    dpy = XkbOpenDisplay(dpyName, NULL, NULL, &mjr, &mnr, &error);
+    if (dpy == NULL)
+    {
+        switch (error)
+        {
+        case XkbOD_BadLibraryVersion:
+            INFO3("%s was compiled with XKB version %d.%02d\n",
+                  program, XkbMajorVersion, XkbMinorVersion);
+            ERROR2("X library supports incompatible version %d.%02d\n",
+                   mjr, mnr);
+            break;
+        case XkbOD_ConnectionRefused:
+            ERROR1("Cannot open display \"%s\"\n", dpyName);
+            break;
+        case XkbOD_NonXkbServer:
+            ERROR1("XKB extension not present on %s\n", dpyName);
+            break;
+        case XkbOD_BadServerVersion:
+            INFO3("%s was compiled with XKB version %d.%02d\n",
+                  program, XkbMajorVersion, XkbMinorVersion);
+            ERROR3("Server %s uses incompatible version %d.%02d\n",
+                   dpyName, mjr, mnr);
+            break;
+        default:
+            WSGO1("Unknown error %d from XkbOpenDisplay\n", error);
+        }
+    }
+    else if (synch)
+        XSynchronize(dpy, True);
+    return dpy;
+}
+
+/***====================================================================***/
+
+#ifdef DEBUG
+extern int yydebug;
+#endif
+
+int
+main(int argc, char *argv[])
+{
+    FILE *file;         /* input file (or stdin) */
+    XkbFile *rtrn;
+    XkbFile *mapToUse;
+    int ok;
+    XkbFileInfo result;
+    Status status;
+
+    yyin = stdin;
+    uSetEntryFile(NullString);
+    uSetDebugFile(NullString);
+    uSetErrorFile(NullString);
+
+    XkbInitIncludePath();
+    if (!parseArgs(argc, argv))
+        exit(1);
+#ifdef DEBUG
+    if (debugFlags & 0x2)
+        yydebug = 1;
+#endif
+    if (preErrorMsg)
+        uSetPreErrorMessage(preErrorMsg);
+    if (errorPrefix)
+        uSetErrorPrefix(errorPrefix);
+    if (postErrorMsg)
+        uSetPostErrorMessage(postErrorMsg);
+    file = NULL;
+    XkbInitAtoms(NULL);
+    XkbAddDefaultDirectoriesToPath();
+    if (xkblist)
+    {
+        Bool gotSome;
+        gotSome = GenerateListing(outputFile);
+        if ((warningLevel > 7) && (!gotSome))
+            return -1;
+        return 0;
+    }
+    if (inputFile != NULL)
+    {
+        if (uStringEqual(inputFile, "-"))
+        {
+            file = stdin;
+            inputFile = "stdin";
+        }
+        else
+        {
+            file = fopen(inputFile, "r");
+        }
+    }
+    else if (inDpyName != NULL)
+    {
+        inDpy = GetDisplay(argv[0], inDpyName);
+        if (!inDpy)
+        {
+            ACTION("Exiting\n");
+            exit(1);
+        }
+    }
+    if (outDpyName != NULL)
+    {
+        outDpy = GetDisplay(argv[0], outDpyName);
+        if (!outDpy)
+        {
+            ACTION("Exiting\n");
+            exit(1);
+        }
+    }
+    if ((inDpy == NULL) && (outDpy == NULL))
+    {
+        int mjr, mnr;
+        mjr = XkbMajorVersion;
+        mnr = XkbMinorVersion;
+        if (!XkbLibraryVersion(&mjr, &mnr))
+        {
+            INFO3("%s was compiled with XKB version %d.%02d\n",
+                  argv[0], XkbMajorVersion, XkbMinorVersion);
+            ERROR2("X library supports incompatible version %d.%02d\n",
+                   mjr, mnr);
+            ACTION("Exiting\n");
+            exit(1);
+        }
+    }
+    if (file)
+    {
+        ok = True;
+        setScanState(inputFile, 1);
+        if ((inputFormat == INPUT_XKB) /* parse .xkb file */
+            && (XKBParseFile(file, &rtrn) && (rtrn != NULL)))
+        {
+            fclose(file);
+            mapToUse = rtrn;
+            if (inputMap != NULL) /* map specified on cmdline? */
+            {
+                while ((mapToUse)
+                       && (!uStringEqual(mapToUse->name, inputMap)))
+                {
+                    mapToUse = (XkbFile *) mapToUse->common.next;
+                }
+                if (!mapToUse)
+                {
+                    FATAL2("No map named \"%s\" in \"%s\"\n",
+                           inputMap, inputFile);
+                    /* NOTREACHED */
+                }
+            }
+            else if (rtrn->common.next != NULL)
+            {
+                /* look for map with XkbLC_Default flag. */
+                mapToUse = rtrn;
+                for (; mapToUse; mapToUse = (XkbFile *) mapToUse->common.next)
+                {
+                    if (mapToUse->flags & XkbLC_Default)
+                        break;
+                }
+                if (!mapToUse)
+                {
+                    mapToUse = rtrn;
+                    if (warningLevel > 4)
+                    {
+                        WARN1
+                            ("No map specified, but \"%s\" has several\n",
+                             inputFile);
+                        ACTION1
+                            ("Using the first defined map, \"%s\"\n",
+                             mapToUse->name);
+                    }
+                }
+            }
+            bzero((char *) &result, sizeof(result));
+            result.type = mapToUse->type;
+            if ((result.xkb = XkbAllocKeyboard()) == NULL)
+            {
+                WSGO("Cannot allocate keyboard description\n");
+                /* NOTREACHED */
+            }
+            switch (mapToUse->type)
+            {
+            case XkmSemanticsFile:
+            case XkmLayoutFile:
+            case XkmKeymapFile:
+                ok = CompileKeymap(mapToUse, &result, MergeReplace);
+                break;
+            case XkmKeyNamesIndex:
+                ok = CompileKeycodes(mapToUse, &result, MergeReplace);
+                break;
+            case XkmTypesIndex:
+                ok = CompileKeyTypes(mapToUse, &result, MergeReplace);
+                break;
+            case XkmSymbolsIndex:
+                /* if it's just symbols, invent key names */
+                result.xkb->flags |= AutoKeyNames;
+                ok = False;
+                break;
+            case XkmCompatMapIndex:
+                ok = CompileCompatMap(mapToUse, &result, MergeReplace, NULL);
+                break;
+            case XkmGeometryFile:
+            case XkmGeometryIndex:
+                /* if it's just a geometry, invent key names */
+                result.xkb->flags |= AutoKeyNames;
+                ok = CompileGeometry(mapToUse, &result, MergeReplace);
+                break;
+            default:
+                WSGO1("Unknown file type %d\n", mapToUse->type);
+                ok = False;
+                break;
+            }
+            result.xkb->device_spec = device_id;
+        }
+        else if (inputFormat == INPUT_XKM) /* parse xkm file */
+        {
+            unsigned tmp;
+            bzero((char *) &result, sizeof(result));
+            if ((result.xkb = XkbAllocKeyboard()) == NULL)
+            {
+                WSGO("Cannot allocate keyboard description\n");
+                /* NOTREACHED */
+            }
+            tmp = XkmReadFile(file, 0, XkmKeymapLegal, &result);
+            if (tmp == XkmKeymapLegal)
+            {
+                ERROR1("Cannot read XKM file \"%s\"\n", inputFile);
+                ok = False;
+            }
+            result.xkb->device_spec = device_id;
+        }
+        else
+        {
+            INFO1("Errors encountered in %s; not compiled.\n", inputFile);
+            ok = False;
+        }
+    }
+    else if (inDpy != NULL)
+    {
+        bzero((char *) &result, sizeof(result));
+        result.type = XkmKeymapFile;
+        result.xkb = XkbGetMap(inDpy, XkbAllMapComponentsMask, device_id);
+        if (result.xkb == NULL)
+            WSGO("Cannot load keyboard description\n");
+        if (XkbGetIndicatorMap(inDpy, ~0, result.xkb) != Success)
+            WSGO("Could not load indicator map\n");
+        if (XkbGetControls(inDpy, XkbAllControlsMask, result.xkb) != Success)
+            WSGO("Could not load keyboard controls\n");
+        if (XkbGetCompatMap(inDpy, XkbAllCompatMask, result.xkb) != Success)
+            WSGO("Could not load compatibility map\n");
+        if (XkbGetNames(inDpy, XkbAllNamesMask, result.xkb) != Success)
+            WSGO("Could not load names\n");
+        if ((status = XkbGetGeometry(inDpy, result.xkb)) != Success)
+        {
+            if (warningLevel > 3)
+            {
+                char buf[100];
+                buf[0] = '\0';
+                XGetErrorText(inDpy, status, buf, 100);
+                WARN1("Could not load keyboard geometry for %s\n", inDpyName);
+                ACTION1("%s\n", buf);
+                ACTION("Resulting keymap file will not describe geometry\n");
+            }
+        }
+        if (computeDflts)
+            ok = (ComputeKbdDefaults(result.xkb) == Success);
+        else
+            ok = True;
+    }
+    else
+    {
+        fprintf(stderr, "Cannot open \"%s\" to compile\n", inputFile);
+        ok = 0;
+    }
+    if (ok)
+    {
+        FILE *out = stdout;
+        if ((inDpy != outDpy) &&
+            (XkbChangeKbdDisplay(outDpy, &result) != Success))
+        {
+            WSGO2("Error converting keyboard display from %s to %s\n",
+                  inDpyName, outDpyName);
+            exit(1);
+        }
+        if (outputFile != NULL)
+        {
+            if (uStringEqual(outputFile, "-"))
+                outputFile = "stdout";
+            else
+            {
+                /*
+                 * fix to prevent symlink attack (e.g.,
+                 * ln -s /etc/passwd /var/tmp/server-0.xkm)
+                 */
+                /*
+                 * this patch may have POSIX, Linux, or GNU libc bias
+                 * -- Branden Robinson
+                 */
+                int outputFileFd;
+                int binMode = 0;
+                const char *openMode = "w";
+                unlink(outputFile);
+#ifdef O_BINARY
+                switch (outputFormat)
+                {
+                case WANT_XKM_FILE:
+                    binMode = O_BINARY;
+                    openMode = "wb";
+                    break;
+                default:
+                    binMode = 0;
+                    break;
+                }
+#endif
+                outputFileFd =
+                    open(outputFile, O_WRONLY | O_CREAT | O_EXCL,
+                         S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH
+                         | S_IWOTH | binMode);
+                if (outputFileFd < 0)
+                {
+                    ERROR1
+                        ("Cannot open \"%s\" to write keyboard description\n",
+                         outputFile);
+                    ACTION("Exiting\n");
+                    exit(1);
+                }
+#ifndef WIN32
+                out = fdopen(outputFileFd, openMode);
+#else
+                close(outputFileFd);
+                out = fopen(outputFile, "wb");
+#endif
+                /* end BR */
+                if (out == NULL)
+                {
+                    ERROR1
+                        ("Cannot open \"%s\" to write keyboard description\n",
+                         outputFile);
+                    ACTION("Exiting\n");
+                    exit(1);
+                }
+            }
+        }
+        switch (outputFormat)
+        {
+        case WANT_XKM_FILE:
+            ok = XkbWriteXKMFile(out, &result);
+            break;
+        case WANT_XKB_FILE:
+            ok = XkbWriteXKBFile(out, &result, showImplicit, NULL, NULL);
+            break;
+        case WANT_C_HDR:
+            ok = XkbWriteCFile(out, outputFile, &result);
+            break;
+        case WANT_X_SERVER:
+            if (!(ok = XkbWriteToServer(&result)))
+            {
+                ERROR2("%s in %s\n", _XkbErrMessages[_XkbErrCode],
+                       _XkbErrLocation ? _XkbErrLocation : "unknown");
+                ACTION1("Couldn't write keyboard description to %s\n",
+                        outDpyName);
+            }
+            break;
+        default:
+            WSGO1("Unknown output format %d\n", outputFormat);
+            ACTION("No output file created\n");
+            ok = False;
+            break;
+        }
+        if (outputFormat != WANT_X_SERVER)
+        {
+            if (fclose(out))
+            {
+                ERROR1("Cannot close \"%s\" properly (not enough space?)\n",
+                       outputFile);
+                ok= False;
+            }
+            else if (!ok)
+            {
+                ERROR2("%s in %s\n", _XkbErrMessages[_XkbErrCode],
+                       _XkbErrLocation ? _XkbErrLocation : "unknown");
+            }
+            if (!ok)
+            {
+                ACTION1("Output file \"%s\" removed\n", outputFile);
+                unlink(outputFile);
+            }
+        }
+    }
+    if (inDpy)
+        XCloseDisplay(inDpy);
+    inDpy = NULL;
+    if (outDpy)
+        XCloseDisplay(outDpy);
+    uFinishUp();
+    return (ok == 0);
+}
diff --git a/xkbcomp.h b/xkbcomp.h
new file mode 100644 (file)
index 0000000..fb40061
--- /dev/null
+++ b/xkbcomp.h
@@ -0,0 +1,397 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 XKBCOMP_H
+#define        XKBCOMP_H 1
+
+#ifndef DEBUG_VAR
+#define        DEBUG_VAR debugFlags
+#endif
+
+#include <X11/Xlib.h>
+#include <X11/XKBlib.h>
+
+#include "utils.h"
+
+#include <X11/extensions/XKM.h>
+#include <X11/extensions/XKBfile.h>
+
+extern char *scanFile;
+
+#define        TypeUnknown     0
+#define        TypeBoolean     1
+#define        TypeInt         2
+#define        TypeFloat       3
+#define        TypeString      4
+#define        TypeAction      5
+#define        TypeKeyName     6
+#define        TypeSymbols     7
+
+#define        StmtUnknown             0
+#define        StmtInclude             1
+#define        StmtKeycodeDef          2
+#define        StmtKeyAliasDef         3
+#define        StmtExpr                4
+#define        StmtVarDef              5
+#define        StmtKeyTypeDef          6
+#define        StmtInterpDef           7
+#define        StmtVModDef             8
+#define        StmtSymbolsDef          9
+#define        StmtModMapDef           10
+#define        StmtGroupCompatDef      11
+#define        StmtIndicatorMapDef     12
+#define        StmtIndicatorNameDef    13
+#define        StmtOutlineDef          14
+#define        StmtShapeDef            15
+#define        StmtKeyDef              16
+#define        StmtRowDef              17
+#define        StmtSectionDef          18
+#define        StmtOverlayKeyDef       19
+#define        StmtOverlayDef          20
+#define        StmtDoodadDef           21
+
+#define        FileSymInterp   100
+
+typedef struct _ParseCommon
+{
+    unsigned stmtType;
+    struct _ParseCommon *next;
+} ParseCommon;
+
+#define        ExprValue       0
+#define        ExprIdent       1
+#define        ExprActionDecl  2
+#define        ExprFieldRef    3
+#define        ExprArrayRef    4
+#define        ExprKeysymList  5
+#define        ExprActionList  6
+#define        ExprCoord       7
+
+#define        OpAdd           20
+#define        OpSubtract      21
+#define        OpMultiply      22
+#define        OpDivide        23
+#define        OpAssign        24
+#define        OpNot           25
+#define        OpNegate        26
+#define        OpInvert        27
+#define        OpUnaryPlus     28
+
+#define        MergeDefault    0
+#define        MergeAugment    1
+#define        MergeOverride   2
+#define        MergeReplace    3
+#define        MergeAltForm    4
+
+#define        AutoKeyNames    (1L <<  0)
+#define        CreateKeyNames(x)       ((x)->flags&AutoKeyNames)
+
+extern unsigned warningLevel;
+extern unsigned optionalParts;
+
+typedef struct _IncludeStmt
+{
+    ParseCommon common;
+    unsigned merge;
+    char *stmt;
+    char *file;
+    char *map;
+    char *modifier;
+    char *path;
+    struct _IncludeStmt *next;
+} IncludeStmt;
+
+typedef struct _Expr
+{
+    ParseCommon common;
+    unsigned op;
+    unsigned type;
+    union
+    {
+        struct
+        {
+            struct _Expr *left;
+            struct _Expr *right;
+        } binary;
+        struct
+        {
+            Atom element;
+            Atom field;
+        } field;
+        struct
+        {
+            Atom element;
+            Atom field;
+            struct _Expr *entry;
+        } array;
+        struct
+        {
+            Atom name;
+            struct _Expr *args;
+        } action;
+        struct
+        {
+            int nSyms;
+            int szSyms;
+            char **syms;
+        } list;
+        struct
+        {
+            int x;
+            int y;
+        } coord;
+        struct _Expr *child;
+        Atom str;
+        unsigned uval;
+        int ival;
+        char keyName[5];
+        Opaque ptr;
+    } value;
+} ExprDef;
+
+typedef struct _VarDef
+{
+    ParseCommon common;
+    unsigned merge;
+    ExprDef *name;
+    ExprDef *value;
+} VarDef;
+
+typedef struct _VModDef
+{
+    ParseCommon common;
+    unsigned merge;
+    Atom name;
+    ExprDef *value;
+} VModDef;
+
+typedef struct _KeycodeDef
+{
+    ParseCommon common;
+    unsigned merge;
+    char name[5];
+    ExprDef *value;
+} KeycodeDef;
+
+typedef struct _KeyAliasDef
+{
+    ParseCommon common;
+    unsigned merge;
+    char alias[5];
+    char real[5];
+} KeyAliasDef;
+
+typedef struct _KeyTypeDef
+{
+    ParseCommon common;
+    unsigned merge;
+    Atom name;
+    VarDef *body;
+} KeyTypeDef;
+
+typedef struct _SymbolsDef
+{
+    ParseCommon common;
+    unsigned merge;
+    char keyName[5];
+    ExprDef *symbols;
+} SymbolsDef;
+
+typedef struct _ModMapDef
+{
+    ParseCommon common;
+    unsigned merge;
+    Atom modifier;
+    ExprDef *keys;
+} ModMapDef;
+
+typedef struct _GroupCompatDef
+{
+    ParseCommon common;
+    unsigned merge;
+    int group;
+    ExprDef *def;
+} GroupCompatDef;
+
+typedef struct _InterpDef
+{
+    ParseCommon common;
+    unsigned merge;
+    KeySym sym;
+    ExprDef *match;
+    VarDef *def;
+    Bool ignore;
+} InterpDef;
+
+typedef struct _IndicatorNameDef
+{
+    ParseCommon common;
+    unsigned merge;
+    int ndx;
+    ExprDef *name;
+    Bool virtual;
+} IndicatorNameDef;
+
+typedef struct _OutlineDef
+{
+    ParseCommon common;
+    Atom field;
+    int nPoints;
+    ExprDef *points;
+} OutlineDef;
+
+typedef struct _ShapeDef
+{
+    ParseCommon common;
+    unsigned merge;
+    Atom name;
+    int nOutlines;
+    OutlineDef *outlines;
+} ShapeDef;
+
+typedef struct _KeyDef
+{
+    ParseCommon common;
+    unsigned defined;
+    char *name;
+    ExprDef *expr;
+} KeyDef;
+
+typedef struct _RowDef
+{
+    ParseCommon common;
+    int nKeys;
+    KeyDef *keys;
+} RowDef;
+
+typedef struct _SectionDef
+{
+    ParseCommon common;
+    unsigned merge;
+    Atom name;
+    int nRows;
+    RowDef *rows;
+} SectionDef;
+
+typedef struct _OverlayKeyDef
+{
+    ParseCommon common;
+    char over[5];
+    char under[5];
+} OverlayKeyDef;
+
+typedef struct _OverlayDef
+{
+    ParseCommon common;
+    unsigned merge;
+    Atom name;
+    int nKeys;
+    OverlayKeyDef *keys;
+} OverlayDef;
+
+typedef struct _DoodadDef
+{
+    ParseCommon common;
+    unsigned merge;
+    unsigned type;
+    Atom name;
+    VarDef *body;
+} DoodadDef;
+
+/* IndicatorMapDef doesn't use the type field, but the rest of the fields
+   need to be at the same offsets as in DoodadDef.  Use #define to avoid
+   any strict aliasing problems.  */
+#define IndicatorMapDef DoodadDef
+
+typedef struct _XkbFile
+{
+    ParseCommon common;
+    int type;
+    char *topName;
+    char *name;
+    ParseCommon *defs;
+    int id;
+    unsigned flags;
+    Bool compiled;
+} XkbFile;
+
+extern Bool CompileKeymap(XkbFile * /* file */ ,
+                          XkbFileInfo * /* result */ ,
+                          unsigned      /* merge */
+    );
+
+extern Bool CompileKeycodes(XkbFile * /* file */ ,
+                            XkbFileInfo * /* result */ ,
+                            unsigned    /* merge */
+    );
+
+extern Bool CompileGeometry(XkbFile * /* file */ ,
+                            XkbFileInfo * /* result */ ,
+                            unsigned    /* merge */
+    );
+
+extern Bool CompileKeyTypes(XkbFile * /* file */ ,
+                            XkbFileInfo * /* result */ ,
+                            unsigned    /* merge */
+    );
+
+typedef struct _LEDInfo *LEDInfoPtr;
+
+extern Bool CompileCompatMap(XkbFile * /* file */ ,
+                             XkbFileInfo * /* result */ ,
+                             unsigned /* merge */ ,
+                             LEDInfoPtr *       /* unboundLEDs */
+    );
+
+extern Bool CompileSymbols(XkbFile * /* file */ ,
+                           XkbFileInfo * /* result */ ,
+                           unsigned     /* merge */
+    );
+
+#define        WantLongListing (1<<0)
+#define        WantPartialMaps (1<<1)
+#define        WantHiddenMaps  (1<<2)
+#define        WantFullNames   (1<<3)
+#define        ListRecursive   (1<<4)
+
+extern char *rootDir;
+extern unsigned verboseLevel;
+extern unsigned dirsToStrip;
+
+extern Bool AddListing(char * /* file */ ,
+                       char *   /* map */
+    );
+
+extern Bool AddMatchingFiles(char *     /* head_in */
+    );
+
+extern int AddMapOnly(char *    /* map */
+    );
+
+extern int GenerateListing(char *       /* filename */
+    );
+
+#endif /* XKBCOMP_H */
diff --git a/xkbcomp.pc.in b/xkbcomp.pc.in
new file mode 100644 (file)
index 0000000..b8d6023
--- /dev/null
@@ -0,0 +1,9 @@
+prefix=@prefix@
+datarootdir=@datarootdir@
+datadir=@datadir@
+xkbconfigdir=@XKBCONFIGROOT@
+
+Name: xkbcomp
+Description: XKB keymap compiler
+Version: @PACKAGE_VERSION@
+Requires.private: @REQUIRED_MODULES@
diff --git a/xkbparse.c b/xkbparse.c
new file mode 100644 (file)
index 0000000..ac581b8
--- /dev/null
@@ -0,0 +1,3150 @@
+/* A Bison parser, made by GNU Bison 2.3.  */
+
+/* Skeleton implementation for Bison's Yacc-like parsers in C
+
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
+
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+   simplifying the original so-called "semantic" parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON 1
+
+/* Bison version.  */
+#define YYBISON_VERSION "2.3"
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
+
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     END_OF_FILE = 0,
+     ERROR_TOK = 255,
+     XKB_KEYMAP = 1,
+     XKB_KEYCODES = 2,
+     XKB_TYPES = 3,
+     XKB_SYMBOLS = 4,
+     XKB_COMPATMAP = 5,
+     XKB_GEOMETRY = 6,
+     XKB_SEMANTICS = 7,
+     XKB_LAYOUT = 8,
+     INCLUDE = 10,
+     OVERRIDE = 11,
+     AUGMENT = 12,
+     REPLACE = 13,
+     ALTERNATE = 14,
+     VIRTUAL_MODS = 20,
+     TYPE = 21,
+     INTERPRET = 22,
+     ACTION_TOK = 23,
+     KEY = 24,
+     ALIAS = 25,
+     GROUP = 26,
+     MODIFIER_MAP = 27,
+     INDICATOR = 28,
+     SHAPE = 29,
+     KEYS = 30,
+     ROW = 31,
+     SECTION = 32,
+     OVERLAY = 33,
+     TEXT = 34,
+     OUTLINE = 35,
+     SOLID = 36,
+     LOGO = 37,
+     VIRTUAL = 38,
+     EQUALS = 40,
+     PLUS = 41,
+     MINUS = 42,
+     DIVIDE = 43,
+     TIMES = 44,
+     OBRACE = 45,
+     CBRACE = 46,
+     OPAREN = 47,
+     CPAREN = 48,
+     OBRACKET = 49,
+     CBRACKET = 50,
+     DOT = 51,
+     COMMA = 52,
+     SEMI = 53,
+     EXCLAM = 54,
+     INVERT = 55,
+     STRING = 60,
+     INTEGER = 61,
+     FLOAT = 62,
+     IDENT = 63,
+     KEYNAME = 64,
+     PARTIAL = 70,
+     DEFAULT = 71,
+     HIDDEN = 72,
+     ALPHANUMERIC_KEYS = 73,
+     MODIFIER_KEYS = 74,
+     KEYPAD_KEYS = 75,
+     FUNCTION_KEYS = 76,
+     ALTERNATE_GROUP = 77
+   };
+#endif
+/* Tokens.  */
+#define END_OF_FILE 0
+#define ERROR_TOK 255
+#define XKB_KEYMAP 1
+#define XKB_KEYCODES 2
+#define XKB_TYPES 3
+#define XKB_SYMBOLS 4
+#define XKB_COMPATMAP 5
+#define XKB_GEOMETRY 6
+#define XKB_SEMANTICS 7
+#define XKB_LAYOUT 8
+#define INCLUDE 10
+#define OVERRIDE 11
+#define AUGMENT 12
+#define REPLACE 13
+#define ALTERNATE 14
+#define VIRTUAL_MODS 20
+#define TYPE 21
+#define INTERPRET 22
+#define ACTION_TOK 23
+#define KEY 24
+#define ALIAS 25
+#define GROUP 26
+#define MODIFIER_MAP 27
+#define INDICATOR 28
+#define SHAPE 29
+#define KEYS 30
+#define ROW 31
+#define SECTION 32
+#define OVERLAY 33
+#define TEXT 34
+#define OUTLINE 35
+#define SOLID 36
+#define LOGO 37
+#define VIRTUAL 38
+#define EQUALS 40
+#define PLUS 41
+#define MINUS 42
+#define DIVIDE 43
+#define TIMES 44
+#define OBRACE 45
+#define CBRACE 46
+#define OPAREN 47
+#define CPAREN 48
+#define OBRACKET 49
+#define CBRACKET 50
+#define DOT 51
+#define COMMA 52
+#define SEMI 53
+#define EXCLAM 54
+#define INVERT 55
+#define STRING 60
+#define INTEGER 61
+#define FLOAT 62
+#define IDENT 63
+#define KEYNAME 64
+#define PARTIAL 70
+#define DEFAULT 71
+#define HIDDEN 72
+#define ALPHANUMERIC_KEYS 73
+#define MODIFIER_KEYS 74
+#define KEYPAD_KEYS 75
+#define FUNCTION_KEYS 76
+#define ALTERNATE_GROUP 77
+
+
+
+
+/* Copy the first part of user declarations.  */
+#line 91 "xkbparse.y"
+
+#ifdef DEBUG
+#define        YYDEBUG 1
+#endif
+#define        DEBUG_VAR parseDebug
+#include "parseutils.h"
+#include <X11/keysym.h>
+#include <X11/extensions/XKBgeom.h>
+#include <stdlib.h>
+
+unsigned int parseDebug;
+
+
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+/* Enabling the token table.  */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
+#endif
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+#line 110 "xkbparse.y"
+{
+       int              ival;
+       unsigned         uval;
+       char            *str;
+       Atom            sval;
+       ParseCommon     *any;
+       ExprDef         *expr;
+       VarDef          *var;
+       VModDef         *vmod;
+       InterpDef       *interp;
+       KeyTypeDef      *keyType;
+       SymbolsDef      *syms;
+       ModMapDef       *modMask;
+       GroupCompatDef  *groupCompat;
+       IndicatorMapDef *ledMap;
+       IndicatorNameDef *ledName;
+       KeycodeDef      *keyName;
+       KeyAliasDef     *keyAlias;
+       ShapeDef        *shape;
+       SectionDef      *section;
+       RowDef          *row;
+       KeyDef          *key;
+       OverlayDef      *overlay;
+       OverlayKeyDef   *olKey;
+       OutlineDef      *outline;
+       DoodadDef       *doodad;
+       XkbFile         *file;
+}
+/* Line 187 of yacc.c.  */
+#line 269 "xkbparse.c"
+       YYSTYPE;
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+
+
+/* Copy the second part of user declarations.  */
+
+
+/* Line 216 of yacc.c.  */
+#line 282 "xkbparse.c"
+
+#ifdef short
+# undef short
+#endif
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
+#endif
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
+#endif
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+#  define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+#  define YYSIZE_T size_t
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# else
+#  define YYSIZE_T unsigned int
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
+#ifndef YY_
+# if YYENABLE_NLS
+#  if ENABLE_NLS
+#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+#   define YY_(msgid) dgettext ("bison-runtime", msgid)
+#  endif
+# endif
+# ifndef YY_
+#  define YY_(msgid) msgid
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E.  */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
+
+/* Identity function, used to suppress warnings about constant conditions.  */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int i)
+#else
+static int
+YYID (i)
+    int i;
+#endif
+{
+  return i;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# ifdef YYSTACK_USE_ALLOCA
+#  if YYSTACK_USE_ALLOCA
+#   ifdef __GNUC__
+#    define YYSTACK_ALLOC __builtin_alloca
+#   elif defined __BUILTIN_VA_ARG_INCR
+#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+#   elif defined _AIX
+#    define YYSTACK_ALLOC __alloca
+#   elif defined _MSC_VER
+#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+#    define alloca _alloca
+#   else
+#    define YYSTACK_ALLOC alloca
+#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#     ifndef _STDLIB_H
+#      define _STDLIB_H 1
+#     endif
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+    /* The OS might guarantee only one guard page at the bottom of the stack,
+       and a page size can be as small as 4096 bytes.  So we cannot safely
+       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
+       to allow for a few compiler-allocated temporary stack slots.  */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+#  endif
+# else
+#  define YYSTACK_ALLOC YYMALLOC
+#  define YYSTACK_FREE YYFREE
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+#  endif
+#  if (defined __cplusplus && ! defined _STDLIB_H \
+       && ! ((defined YYMALLOC || defined malloc) \
+            && (defined YYFREE || defined free)))
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   ifndef _STDLIB_H
+#    define _STDLIB_H 1
+#   endif
+#  endif
+#  ifndef YYMALLOC
+#   define YYMALLOC malloc
+#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+#  ifndef YYFREE
+#   define YYFREE free
+#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+# endif
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+
+
+#if (! defined yyoverflow \
+     && (! defined __cplusplus \
+        || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  yytype_int16 yyss;
+  YYSTYPE yyvs;
+  };
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+      + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if defined __GNUC__ && 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)             \
+      do                                       \
+       {                                       \
+         YYSIZE_T yyi;                         \
+         for (yyi = 0; yyi < (Count); yyi++)   \
+           (To)[yyi] = (From)[yyi];            \
+       }                                       \
+      while (YYID (0))
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack)                                       \
+    do                                                                 \
+      {                                                                        \
+       YYSIZE_T yynewbytes;                                            \
+       YYCOPY (&yyptr->Stack, Stack, yysize);                          \
+       Stack = &yyptr->Stack;                                          \
+       yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+       yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                        \
+    while (YYID (0))
+
+#endif
+
+/* YYFINAL -- State number of the termination state.  */
+#define YYFINAL  18
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   706
+
+/* YYNTOKENS -- Number of terminals.  */
+#define YYNTOKENS  65
+/* YYNNTS -- Number of nonterminals.  */
+#define YYNNTS  73
+/* YYNRULES -- Number of rules.  */
+#define YYNRULES  184
+/* YYNRULES -- Number of states.  */
+#define YYNSTATES  335
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   257
+
+#define YYTRANSLATE(YYX)                                               \
+  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const yytype_uint8 yytranslate[] =
+{
+       0,     4,     5,     6,     7,     8,     9,    10,    11,     2,
+      12,    13,    14,    15,    16,     2,     2,     2,     2,     2,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,     2,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,     2,     2,     2,     2,
+      52,    53,    54,    55,    56,     2,     2,     2,     2,     2,
+      57,    58,    59,    60,    61,    62,    63,    64,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     3,     1,     2
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const yytype_uint16 yyprhs[] =
+{
+       0,     0,     3,     5,     7,     9,    12,    14,    22,    24,
+      26,    28,    31,    33,    41,    46,    48,    50,    52,    54,
+      56,    58,    59,    62,    64,    66,    68,    70,    72,    74,
+      76,    78,    80,    83,    84,    87,    90,    93,    96,    99,
+     102,   105,   108,   111,   114,   117,   120,   123,   126,   129,
+     134,   137,   141,   146,   152,   156,   160,   162,   164,   168,
+     175,   179,   181,   184,   186,   193,   200,   204,   206,   207,
+     211,   215,   217,   220,   222,   226,   230,   236,   243,   250,
+     256,   263,   270,   277,   284,   287,   289,   295,   297,   299,
+     301,   303,   306,   308,   314,   316,   320,   322,   324,   328,
+     335,   339,   341,   345,   349,   351,   355,   361,   365,   369,
+     371,   377,   384,   386,   388,   390,   392,   394,   396,   398,
+     400,   402,   404,   406,   408,   410,   412,   414,   416,   418,
+     420,   421,   423,   425,   427,   429,   431,   433,   434,   438,
+     440,   444,   448,   452,   456,   460,   462,   465,   468,   471,
+     474,   476,   481,   483,   487,   491,   493,   498,   500,   504,
+     509,   516,   518,   520,   522,   524,   526,   527,   531,   533,
+     535,   537,   539,   542,   544,   546,   548,   550,   552,   554,
+     556,   558,   560,   562,   563
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
+static const yytype_int16 yyrhs[] =
+{
+      66,     0,    -1,    67,    -1,    70,    -1,    72,    -1,    67,
+      68,    -1,    68,    -1,    74,    69,   136,    41,    70,    42,
+      49,    -1,     4,    -1,    10,    -1,    11,    -1,    70,    71,
+      -1,    71,    -1,    74,    73,   136,    41,    77,    42,    49,
+      -1,    74,    73,   136,    77,    -1,     5,    -1,     6,    -1,
+       8,    -1,     7,    -1,     9,    -1,    75,    -1,    -1,    75,
+      76,    -1,    76,    -1,    57,    -1,    58,    -1,    59,    -1,
+      60,    -1,    61,    -1,    62,    -1,    63,    -1,    64,    -1,
+      77,    78,    -1,    -1,   116,    79,    -1,   116,    82,    -1,
+     116,    85,    -1,   116,    80,    -1,   116,    81,    -1,   116,
+      88,    -1,   116,    89,    -1,   116,    94,    -1,   116,    93,
+      -1,   116,    95,    -1,   116,    96,    -1,   116,    97,    -1,
+     116,    98,    -1,   116,   112,    -1,   117,    52,    -1,   124,
+      36,   120,    49,    -1,   134,    49,    -1,    50,   134,    49,
+      -1,   133,    36,   120,    49,    -1,    22,   133,    36,   133,
+      49,    -1,    17,    83,    49,    -1,    83,    48,    84,    -1,
+      84,    -1,   134,    -1,   134,    36,   120,    -1,    19,    86,
+      41,    87,    42,    49,    -1,   128,    37,   120,    -1,   128,
+      -1,    87,    79,    -1,    79,    -1,    18,   135,    41,    87,
+      42,    49,    -1,    21,   133,    41,    90,    42,    49,    -1,
+      90,    48,    91,    -1,    91,    -1,    -1,   124,    36,   120,
+      -1,   124,    36,    92,    -1,   134,    -1,    50,   134,    -1,
+      92,    -1,    45,   126,    46,    -1,    45,   122,    46,    -1,
+      23,   132,    36,   120,    49,    -1,    24,   134,    41,   119,
+      42,    49,    -1,    25,   135,    41,    87,    42,    49,    -1,
+      25,   132,    36,   120,    49,    -1,    35,    25,   132,    36,
+     120,    49,    -1,    26,   135,    41,   108,    42,    49,    -1,
+      26,   135,    41,   110,    42,    49,    -1,    29,   135,    41,
+      99,    42,    49,    -1,    99,   100,    -1,   100,    -1,    28,
+      41,   101,    42,    49,    -1,    79,    -1,   112,    -1,    95,
+      -1,   105,    -1,   101,   102,    -1,   102,    -1,    27,    41,
+     103,    42,    49,    -1,    79,    -1,   103,    48,   104,    -1,
+     104,    -1,   133,    -1,    41,   119,    42,    -1,    30,   135,
+      41,   106,    42,    49,    -1,   106,    48,   107,    -1,   107,
+      -1,   133,    36,   133,    -1,   108,    48,   109,    -1,   109,
+      -1,    41,   110,    42,    -1,   134,    36,    41,   110,    42,
+      -1,   134,    36,   120,    -1,   110,    48,   111,    -1,   111,
+      -1,    45,   129,    48,   129,    46,    -1,   113,   135,    41,
+      87,    42,    49,    -1,    31,    -1,    32,    -1,    33,    -1,
+      34,    -1,   134,    -1,   115,    -1,    20,    -1,    19,    -1,
+      18,    -1,    21,    -1,    23,    -1,    24,    -1,    25,    -1,
+      26,    -1,    28,    -1,    29,    -1,    31,    -1,   117,    -1,
+      -1,    12,    -1,    14,    -1,    13,    -1,    15,    -1,    16,
+      -1,   119,    -1,    -1,   119,    48,   120,    -1,   120,    -1,
+     120,    39,   120,    -1,   120,    37,   120,    -1,   120,    38,
+     120,    -1,   120,    40,   120,    -1,   124,    36,   120,    -1,
+     121,    -1,    38,   121,    -1,    37,   121,    -1,    50,   121,
+      -1,    51,   121,    -1,   124,    -1,   114,    43,   118,    44,
+      -1,   125,    -1,    43,   120,    44,    -1,   122,    48,   123,
+      -1,   123,    -1,   114,    43,   118,    44,    -1,   114,    -1,
+     114,    47,   114,    -1,   114,    45,   120,    46,    -1,   114,
+      47,   114,    45,   120,    46,    -1,   135,    -1,   132,    -1,
+     131,    -1,   133,    -1,   127,    -1,    -1,   127,    48,   128,
+      -1,   128,    -1,    55,    -1,    29,    -1,   132,    -1,    38,
+     130,    -1,   130,    -1,    54,    -1,    53,    -1,    54,    -1,
+      53,    -1,    56,    -1,    55,    -1,    58,    -1,    52,    -1,
+     137,    -1,    -1,    52,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const yytype_uint16 yyrline[] =
+{
+       0,   168,   168,   170,   172,   176,   178,   182,   188,   189,
+     190,   193,   195,   199,   205,   210,   211,   212,   213,   214,
+     217,   218,   221,   222,   225,   226,   227,   228,   229,   230,
+     231,   232,   235,   237,   240,   245,   250,   255,   260,   265,
+     270,   275,   280,   285,   290,   295,   300,   305,   310,   322,
+     324,   326,   330,   341,   351,   355,   357,   361,   363,   367,
+     376,   378,   382,   384,   388,   394,   400,   402,   404,   407,
+     409,   411,   413,   415,   419,   421,   425,   429,   433,   437,
+     439,   443,   445,   453,   457,   459,   463,   465,   467,   469,
+     471,   475,   477,   481,   483,   487,   489,   493,   495,   499,
+     503,   508,   512,   516,   518,   522,   524,   526,   530,   532,
+     536,   546,   550,   551,   552,   553,   556,   557,   560,   562,
+     564,   566,   568,   570,   572,   574,   576,   578,   580,   584,
+     585,   588,   589,   590,   591,   592,   595,   596,   599,   601,
+     605,   607,   609,   611,   613,   615,   619,   621,   623,   625,
+     627,   629,   631,   633,   637,   639,   643,   647,   654,   662,
+     671,   682,   689,   696,   703,   714,   715,   718,   720,   724,
+     725,   726,   733,   734,   737,   738,   741,   744,   747,   750,
+     751,   754,   757,   758,   761
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
+static const char *const yytname[] =
+{
+  "END_OF_FILE", "error", "$undefined", "ERROR_TOK", "XKB_KEYMAP",
+  "XKB_KEYCODES", "XKB_TYPES", "XKB_SYMBOLS", "XKB_COMPATMAP",
+  "XKB_GEOMETRY", "XKB_SEMANTICS", "XKB_LAYOUT", "INCLUDE", "OVERRIDE",
+  "AUGMENT", "REPLACE", "ALTERNATE", "VIRTUAL_MODS", "TYPE", "INTERPRET",
+  "ACTION_TOK", "KEY", "ALIAS", "GROUP", "MODIFIER_MAP", "INDICATOR",
+  "SHAPE", "KEYS", "ROW", "SECTION", "OVERLAY", "TEXT", "OUTLINE", "SOLID",
+  "LOGO", "VIRTUAL", "EQUALS", "PLUS", "MINUS", "DIVIDE", "TIMES",
+  "OBRACE", "CBRACE", "OPAREN", "CPAREN", "OBRACKET", "CBRACKET", "DOT",
+  "COMMA", "SEMI", "EXCLAM", "INVERT", "STRING", "INTEGER", "FLOAT",
+  "IDENT", "KEYNAME", "PARTIAL", "DEFAULT", "HIDDEN", "ALPHANUMERIC_KEYS",
+  "MODIFIER_KEYS", "KEYPAD_KEYS", "FUNCTION_KEYS", "ALTERNATE_GROUP",
+  "$accept", "XkbFile", "XkbCompMapList", "XkbCompositeMap",
+  "XkbCompositeType", "XkbMapConfigList", "XkbMapConfig", "XkbConfig",
+  "FileType", "OptFlags", "Flags", "Flag", "DeclList", "Decl", "VarDecl",
+  "KeyNameDecl", "KeyAliasDecl", "VModDecl", "VModDefList", "VModDef",
+  "InterpretDecl", "InterpretMatch", "VarDeclList", "KeyTypeDecl",
+  "SymbolsDecl", "SymbolsBody", "SymbolsVarDecl", "ArrayInit",
+  "GroupCompatDecl", "ModMapDecl", "IndicatorMapDecl", "IndicatorNameDecl",
+  "ShapeDecl", "SectionDecl", "SectionBody", "SectionBodyItem", "RowBody",
+  "RowBodyItem", "Keys", "Key", "OverlayDecl", "OverlayKeyList",
+  "OverlayKey", "OutlineList", "OutlineInList", "CoordList", "Coord",
+  "DoodadDecl", "DoodadType", "FieldSpec", "Element", "OptMergeMode",
+  "MergeMode", "OptExprList", "ExprList", "Expr", "Term", "ActionList",
+  "Action", "Lhs", "Terminal", "OptKeySymList", "KeySymList", "KeySym",
+  "SignedNumber", "Number", "Float", "Integer", "KeyName", "Ident",
+  "String", "OptMapName", "MapName", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const yytype_uint16 yytoknum[] =
+{
+       0,   256,   257,   255,     1,     2,     3,     4,     5,     6,
+       7,     8,    10,    11,    12,    13,    14,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    40,    41,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    60,    61,    62,    63,    64,    70,    71,    72,
+      73,    74,    75,    76,    77
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const yytype_uint8 yyr1[] =
+{
+       0,    65,    66,    66,    66,    67,    67,    68,    69,    69,
+      69,    70,    70,    71,    72,    73,    73,    73,    73,    73,
+      74,    74,    75,    75,    76,    76,    76,    76,    76,    76,
+      76,    76,    77,    77,    78,    78,    78,    78,    78,    78,
+      78,    78,    78,    78,    78,    78,    78,    78,    78,    79,
+      79,    79,    80,    81,    82,    83,    83,    84,    84,    85,
+      86,    86,    87,    87,    88,    89,    90,    90,    90,    91,
+      91,    91,    91,    91,    92,    92,    93,    94,    95,    96,
+      96,    97,    97,    98,    99,    99,   100,   100,   100,   100,
+     100,   101,   101,   102,   102,   103,   103,   104,   104,   105,
+     106,   106,   107,   108,   108,   109,   109,   109,   110,   110,
+     111,   112,   113,   113,   113,   113,   114,   114,   115,   115,
+     115,   115,   115,   115,   115,   115,   115,   115,   115,   116,
+     116,   117,   117,   117,   117,   117,   118,   118,   119,   119,
+     120,   120,   120,   120,   120,   120,   121,   121,   121,   121,
+     121,   121,   121,   121,   122,   122,   123,   124,   124,   124,
+     124,   125,   125,   125,   125,   126,   126,   127,   127,   128,
+     128,   128,   129,   129,   130,   130,   131,   132,   133,   134,
+     134,   135,   136,   136,   137
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const yytype_uint8 yyr2[] =
+{
+       0,     2,     1,     1,     1,     2,     1,     7,     1,     1,
+       1,     2,     1,     7,     4,     1,     1,     1,     1,     1,
+       1,     0,     2,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     2,     0,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     4,
+       2,     3,     4,     5,     3,     3,     1,     1,     3,     6,
+       3,     1,     2,     1,     6,     6,     3,     1,     0,     3,
+       3,     1,     2,     1,     3,     3,     5,     6,     6,     5,
+       6,     6,     6,     6,     2,     1,     5,     1,     1,     1,
+       1,     2,     1,     5,     1,     3,     1,     1,     3,     6,
+       3,     1,     3,     3,     1,     3,     5,     3,     3,     1,
+       5,     6,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       0,     1,     1,     1,     1,     1,     1,     0,     3,     1,
+       3,     3,     3,     3,     3,     1,     2,     2,     2,     2,
+       1,     4,     1,     3,     3,     1,     4,     1,     3,     4,
+       6,     1,     1,     1,     1,     1,     0,     3,     1,     1,
+       1,     1,     2,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     0,     1
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const yytype_uint8 yydefact[] =
+{
+      21,    24,    25,    26,    27,    28,    29,    30,    31,     0,
+      21,     6,    21,    12,     4,     0,    20,    23,     1,     5,
+       0,    11,     0,     8,    15,    16,    18,    17,    19,     9,
+      10,   183,   183,    22,   183,   184,     0,   182,    33,     0,
+      21,    33,   130,    21,   130,   131,   133,   132,   134,   135,
+      32,     0,   129,     0,     0,     0,   120,   119,   118,   121,
+       0,   122,   123,   124,   125,   126,   127,   128,   113,   114,
+     115,     0,     0,   179,   178,   180,    34,    37,    38,    35,
+      36,    39,    40,    42,    41,    43,    44,    45,    46,    47,
+       0,   157,   117,     0,     0,   116,    48,     7,    13,     0,
+      56,    57,   181,     0,   170,   177,   169,     0,    61,   171,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    50,     0,    54,     0,     0,
+       0,     0,    68,     0,     0,     0,     0,     0,     0,     0,
+       0,    51,     0,   120,   119,   121,   122,   123,   124,   125,
+     127,   128,     0,     0,     0,     0,     0,   176,   157,     0,
+     145,   150,   152,   163,   162,   164,   116,   161,   158,     0,
+       0,    55,    58,    63,     0,     0,    60,   166,     0,     0,
+      67,    73,     0,   116,     0,     0,     0,   139,     0,     0,
+       0,     0,     0,   104,     0,   109,     0,   124,   126,     0,
+      87,    89,     0,    85,    90,    88,     0,     0,   147,   150,
+     146,     0,   148,   149,   137,     0,     0,     0,     0,   159,
+       0,     0,    49,    52,     0,    62,     0,   170,   169,     0,
+       0,   155,     0,   165,   168,    72,     0,     0,     0,    53,
+      76,     0,     0,    79,     0,     0,     0,   175,   174,     0,
+     173,     0,     0,     0,     0,     0,     0,     0,     0,    84,
+       0,     0,   153,     0,   136,   141,   142,   140,   143,   144,
+       0,    64,    59,   137,    75,     0,    74,     0,    65,    66,
+      70,    69,    77,   138,    78,   105,   172,     0,    81,   103,
+      82,   108,     0,   107,     0,    94,     0,    92,     0,    83,
+      80,   111,   151,   160,     0,   154,   167,     0,     0,     0,
+       0,    91,     0,   101,     0,   156,   110,   106,     0,     0,
+      96,    97,    86,     0,     0,     0,     0,     0,     0,    99,
+     100,   102,    98,    93,    95
+};
+
+/* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int16 yydefgoto[] =
+{
+      -1,     9,    10,    11,    31,    12,    13,    14,    32,    22,
+      16,    17,    42,    50,   173,    77,    78,    79,    99,   100,
+      80,   107,   174,    81,    82,   179,   180,   181,    83,    84,
+     201,    86,    87,    88,   202,   203,   296,   297,   319,   320,
+     204,   312,   313,   192,   193,   194,   195,   205,    90,   158,
+      92,    51,    52,   263,   264,   187,   160,   230,   231,   161,
+     162,   232,   233,   108,   249,   250,   163,   164,   165,   166,
+     167,    36,    37
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -188
+static const yytype_int16 yypact[] =
+{
+     628,  -188,  -188,  -188,  -188,  -188,  -188,  -188,  -188,    12,
+       4,  -188,    58,  -188,  -188,   695,   628,  -188,  -188,  -188,
+     121,  -188,   408,  -188,  -188,  -188,  -188,  -188,  -188,  -188,
+    -188,    -9,    -9,  -188,    -9,  -188,    19,  -188,    45,    45,
+     628,  -188,   174,   620,   137,  -188,  -188,  -188,  -188,  -188,
+    -188,   317,    39,   -15,    50,     1,    59,   -18,  -188,    72,
+      72,   106,     1,   -27,    59,  -188,    59,    62,  -188,  -188,
+    -188,   117,     1,  -188,  -188,  -188,  -188,  -188,  -188,  -188,
+    -188,  -188,  -188,  -188,  -188,  -188,  -188,  -188,  -188,  -188,
+      59,    51,  -188,   125,   146,   134,  -188,  -188,  -188,   132,
+    -188,   163,  -188,   168,  -188,  -188,  -188,   173,   179,  -188,
+     178,   186,   190,   194,   206,   204,   208,   221,   106,   216,
+     225,   265,   640,   265,   265,  -188,     1,  -188,   265,   599,
+     599,   265,   470,    72,   265,   265,   265,   599,   -26,    21,
+     239,  -188,   599,  -188,  -188,  -188,  -188,  -188,  -188,  -188,
+    -188,  -188,   265,   265,   265,   265,   265,  -188,   159,   232,
+    -188,   240,  -188,  -188,  -188,  -188,  -188,  -188,   223,    98,
+     156,  -188,   260,  -188,   485,   513,   260,   617,     1,    30,
+    -188,  -188,   243,    32,   231,   192,    64,   260,   199,   528,
+     236,    35,   127,  -188,   128,  -188,   251,    59,   270,    59,
+    -188,  -188,   422,  -188,  -188,  -188,   265,   556,  -188,  -188,
+    -188,   342,  -188,  -188,   265,   265,   265,   265,   265,  -188,
+     265,   265,  -188,  -188,   263,  -188,   264,   249,   271,   281,
+      61,  -188,   279,   278,  -188,  -188,   280,   470,   340,  -188,
+    -188,   283,   265,  -188,   284,   129,    16,  -188,  -188,   282,
+    -188,   298,   -34,   308,   236,   381,   576,   287,   321,  -188,
+     215,   325,  -188,   332,   336,   158,   158,  -188,  -188,   260,
+     316,  -188,  -188,   265,  -188,   640,  -188,   -18,  -188,  -188,
+    -188,   260,  -188,   260,  -188,  -188,  -188,    35,  -188,  -188,
+    -188,  -188,   236,   260,   346,  -188,   442,  -188,    72,  -188,
+    -188,  -188,  -188,  -188,   344,  -188,  -188,   343,   143,   -28,
+     348,  -188,   176,  -188,   367,  -188,  -188,  -188,   265,   198,
+    -188,  -188,  -188,   359,    72,    72,   202,   362,   -28,  -188,
+    -188,  -188,  -188,  -188,  -188
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const yytype_int16 yypgoto[] =
+{
+    -188,  -188,  -188,   410,  -188,   383,    -7,  -188,   399,    38,
+    -188,   409,   385,  -188,   -35,  -188,  -188,  -188,  -188,   301,
+    -188,  -188,   -47,  -188,  -188,  -188,   191,   200,  -188,  -188,
+     378,  -188,  -188,  -188,  -188,   228,  -188,   148,  -188,   130,
+    -188,  -188,   133,  -188,   197,  -187,   205,   423,  -188,    26,
+    -188,  -188,  -188,   203,  -134,    89,   104,  -188,   207,   -29,
+    -188,  -188,  -188,  -175,   188,   233,  -188,   -43,   -51,   -45,
+     -33,   109,  -188
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, syntax error.  */
+#define YYTABLE_NINF -180
+static const yytype_int16 yytable[] =
+{
+      94,   186,   234,   245,    -2,    21,    95,   190,   110,   111,
+     101,   104,    18,   318,   109,   190,    76,   113,   112,   191,
+     114,    73,    93,   103,    75,   102,   105,   119,    74,    73,
+     115,   116,    75,   117,    97,   105,    21,   106,    15,   143,
+     144,    58,   145,    35,   146,   147,   197,   149,    20,   198,
+     150,   199,    67,    68,    69,    70,    73,   120,    -3,    75,
+      40,     1,     2,     3,     4,     5,     6,     7,     8,   247,
+     248,    72,   236,   246,   -71,   140,    73,    91,   237,    75,
+     -71,   101,   184,   175,    95,    95,    41,   183,   247,   248,
+     189,    96,    95,   196,    95,   207,   121,    95,   122,    98,
+      93,    93,   306,   182,   200,   308,   241,   274,    93,   275,
+      93,   102,   242,    93,  -112,     1,     2,     3,     4,     5,
+       6,     7,     8,   209,   209,    23,   209,   209,    74,    95,
+      95,    29,    30,   235,   109,   215,   216,   217,   218,   225,
+     225,    38,   118,    39,    95,    93,    93,   222,   168,    45,
+      46,    47,    48,    49,   225,    91,    91,    95,    91,   105,
+      93,   123,    95,    91,   115,    91,   257,   200,    91,   251,
+     253,   285,   225,    93,   -14,   252,   254,   254,    93,    54,
+     126,   127,   124,   125,   326,   317,    45,    46,    47,    48,
+      49,   254,   183,   215,   216,   217,   218,   217,   218,   128,
+      91,    91,   214,   229,   121,   223,   122,   196,   182,   129,
+     159,    95,   169,   170,   130,    91,   131,   172,   323,   132,
+     176,   295,   133,   185,   324,   188,   134,    93,    91,   215,
+     216,   217,   218,    91,   109,   135,   215,   216,   217,   218,
+     327,   240,   136,   211,   332,   137,   328,   314,   243,   138,
+     242,    95,   215,   216,   217,   218,   208,   210,   321,   212,
+     213,   295,   139,    91,   300,   141,   142,    93,   221,   215,
+     216,   217,   218,   314,   331,   206,   220,   321,   219,   238,
+     239,   191,    91,   143,   144,    58,   145,   255,   146,   147,
+     148,   149,  -127,    65,   150,   260,   151,   215,   216,   217,
+     218,   229,   152,   153,   265,   266,   267,   268,   154,   269,
+     270,   256,   271,   272,  -179,   155,   156,   102,   105,   157,
+      73,    74,    91,    75,   273,   276,   277,   281,   298,   278,
+     287,   283,   282,   284,    55,    56,    57,    58,    59,    60,
+      61,    62,    63,    64,   293,    65,    66,   288,    67,    68,
+      69,    70,    71,   215,   216,   217,   218,   290,   143,   144,
+      58,   145,   303,   146,   147,   148,   149,    72,    65,   150,
+     299,   151,    73,    74,   301,    75,   302,   152,   153,   215,
+     216,   217,   218,   154,   242,   177,   262,   309,   315,   316,
+     155,   156,   102,   105,   157,    73,    74,   322,    75,   143,
+     144,    58,   145,   325,   146,   147,   148,   149,   329,    65,
+     150,   333,   151,    24,    25,    26,    27,    28,   152,   153,
+      19,    34,   292,    43,   154,    33,    44,   171,   279,    85,
+     259,   155,   156,   102,   105,   157,    73,    74,   280,    75,
+     143,   144,    58,   145,   311,   146,   147,   197,   149,   289,
+     198,   150,   199,    67,    68,    69,    70,   330,   334,   291,
+     143,   144,    58,   145,   258,   146,   147,   148,   149,   294,
+      65,   150,    72,   151,    89,   307,   304,    73,     0,   286,
+      75,     0,   305,     0,   310,     0,     0,     0,   143,   144,
+      58,   145,    72,   146,   147,   148,   149,    73,    65,   150,
+      75,   151,     0,   143,   144,    58,   145,     0,   146,   147,
+     148,   149,     0,    65,   150,   177,   151,     0,     0,     0,
+     178,     0,     0,     0,     0,    73,     0,   224,    75,     0,
+       0,   143,   144,    58,   145,    72,   146,   147,   148,   149,
+      73,    65,   150,    75,   151,     0,   143,   144,    58,   145,
+       0,   146,   147,   148,   149,   226,    65,   150,     0,   151,
+       0,     0,     0,    72,     0,     0,     0,     0,    73,     0,
+     244,    75,     0,     0,   143,   144,    58,   145,    72,   146,
+     147,   148,   149,    73,    65,   150,    75,   151,     0,     0,
+       0,     0,     0,     0,   143,   144,    58,   145,   261,   146,
+     147,   148,   149,   294,    65,   150,    72,   151,     0,     0,
+       0,    73,     0,     0,    75,     0,     0,   143,   144,    58,
+     145,     0,   146,   147,   148,   149,    72,    65,   150,     0,
+     151,    73,     0,     0,    75,   143,   144,    58,   145,     0,
+     146,   147,   148,   149,     0,    65,   227,     0,   151,    72,
+       0,     0,     0,     0,    73,     0,     0,    75,   143,   144,
+      58,   145,    53,   146,   147,   148,   149,     0,    65,   150,
+     105,   151,   228,     0,     0,    75,     0,     1,     2,     3,
+       4,     5,     6,     7,     8,     1,     2,     3,     4,     5,
+       6,     7,     8,     0,     0,    73,     0,     0,    75,    23,
+      24,    25,    26,    27,    28,    29,    30
+};
+
+static const yytype_int16 yycheck[] =
+{
+      51,   135,   177,   190,     0,    12,    51,    41,    59,    60,
+      55,    29,     0,    41,    57,    41,    51,    62,    61,    45,
+      63,    55,    51,    56,    58,    52,    53,    72,    56,    55,
+      63,    64,    58,    66,    49,    53,    43,    55,     0,    18,
+      19,    20,    21,    52,    23,    24,    25,    26,    10,    28,
+      29,    30,    31,    32,    33,    34,    55,    90,     0,    58,
+      41,    57,    58,    59,    60,    61,    62,    63,    64,    53,
+      54,    50,    42,    38,    42,   118,    55,    51,    48,    58,
+      48,   126,   133,   130,   129,   130,    41,   132,    53,    54,
+     137,    52,   137,   138,   139,   142,    45,   142,    47,    49,
+     129,   130,   277,   132,   139,   292,    42,    46,   137,    48,
+     139,    52,    48,   142,    52,    57,    58,    59,    60,    61,
+      62,    63,    64,   152,   153,     4,   155,   156,    56,   174,
+     175,    10,    11,   178,   177,    37,    38,    39,    40,   174,
+     175,    32,    25,    34,   189,   174,   175,    49,   122,    12,
+      13,    14,    15,    16,   189,   129,   130,   202,   132,    53,
+     189,    36,   207,   137,   197,   139,   199,   202,   142,    42,
+      42,    42,   207,   202,     0,    48,    48,    48,   207,    42,
+      48,    49,    36,    49,   318,    42,    12,    13,    14,    15,
+      16,    48,   237,    37,    38,    39,    40,    39,    40,    36,
+     174,   175,    43,   177,    45,    49,    47,   252,   237,    41,
+     121,   256,   123,   124,    41,   189,    37,   128,    42,    41,
+     131,   256,    36,   134,    48,   136,    36,   256,   202,    37,
+      38,    39,    40,   207,   277,    41,    37,    38,    39,    40,
+      42,    49,    36,   154,    42,    41,    48,   298,    49,    41,
+      48,   296,    37,    38,    39,    40,   152,   153,   309,   155,
+     156,   296,    41,   237,    49,    49,    41,   296,    45,    37,
+      38,    39,    40,   324,   325,    36,    36,   328,    46,    36,
+      49,    45,   256,    18,    19,    20,    21,    36,    23,    24,
+      25,    26,    43,    28,    29,   206,    31,    37,    38,    39,
+      40,   275,    37,    38,   215,   216,   217,   218,    43,   220,
+     221,    41,    49,    49,    43,    50,    51,    52,    53,    54,
+      55,    56,   296,    58,    43,    46,    48,   238,    41,    49,
+      48,   242,    49,    49,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,   255,    28,    29,    49,    31,    32,
+      33,    34,    35,    37,    38,    39,    40,    49,    18,    19,
+      20,    21,    46,    23,    24,    25,    26,    50,    28,    29,
+      49,    31,    55,    56,    49,    58,    44,    37,    38,    37,
+      38,    39,    40,    43,    48,    45,    44,    41,    44,    46,
+      50,    51,    52,    53,    54,    55,    56,    49,    58,    18,
+      19,    20,    21,    36,    23,    24,    25,    26,    49,    28,
+      29,    49,    31,     5,     6,     7,     8,     9,    37,    38,
+      10,    22,    41,    40,    43,    16,    41,   126,   237,    51,
+     202,    50,    51,    52,    53,    54,    55,    56,   238,    58,
+      18,    19,    20,    21,   296,    23,    24,    25,    26,   252,
+      28,    29,    30,    31,    32,    33,    34,   324,   328,   254,
+      18,    19,    20,    21,    42,    23,    24,    25,    26,    27,
+      28,    29,    50,    31,    51,   287,   273,    55,    -1,   246,
+      58,    -1,   275,    -1,    42,    -1,    -1,    -1,    18,    19,
+      20,    21,    50,    23,    24,    25,    26,    55,    28,    29,
+      58,    31,    -1,    18,    19,    20,    21,    -1,    23,    24,
+      25,    26,    -1,    28,    29,    45,    31,    -1,    -1,    -1,
+      50,    -1,    -1,    -1,    -1,    55,    -1,    42,    58,    -1,
+      -1,    18,    19,    20,    21,    50,    23,    24,    25,    26,
+      55,    28,    29,    58,    31,    -1,    18,    19,    20,    21,
+      -1,    23,    24,    25,    26,    42,    28,    29,    -1,    31,
+      -1,    -1,    -1,    50,    -1,    -1,    -1,    -1,    55,    -1,
+      42,    58,    -1,    -1,    18,    19,    20,    21,    50,    23,
+      24,    25,    26,    55,    28,    29,    58,    31,    -1,    -1,
+      -1,    -1,    -1,    -1,    18,    19,    20,    21,    42,    23,
+      24,    25,    26,    27,    28,    29,    50,    31,    -1,    -1,
+      -1,    55,    -1,    -1,    58,    -1,    -1,    18,    19,    20,
+      21,    -1,    23,    24,    25,    26,    50,    28,    29,    -1,
+      31,    55,    -1,    -1,    58,    18,    19,    20,    21,    -1,
+      23,    24,    25,    26,    -1,    28,    29,    -1,    31,    50,
+      -1,    -1,    -1,    -1,    55,    -1,    -1,    58,    18,    19,
+      20,    21,    42,    23,    24,    25,    26,    -1,    28,    29,
+      53,    31,    55,    -1,    -1,    58,    -1,    57,    58,    59,
+      60,    61,    62,    63,    64,    57,    58,    59,    60,    61,
+      62,    63,    64,    -1,    -1,    55,    -1,    -1,    58,     4,
+       5,     6,     7,     8,     9,    10,    11
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const yytype_uint8 yystos[] =
+{
+       0,    57,    58,    59,    60,    61,    62,    63,    64,    66,
+      67,    68,    70,    71,    72,    74,    75,    76,     0,    68,
+      74,    71,    74,     4,     5,     6,     7,     8,     9,    10,
+      11,    69,    73,    76,    73,    52,   136,   137,   136,   136,
+      41,    41,    77,    70,    77,    12,    13,    14,    15,    16,
+      78,   116,   117,    42,    42,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    28,    29,    31,    32,    33,
+      34,    35,    50,    55,    56,    58,    79,    80,    81,    82,
+      85,    88,    89,    93,    94,    95,    96,    97,    98,   112,
+     113,   114,   115,   124,   133,   134,    52,    49,    49,    83,
+      84,   134,    52,   135,    29,    53,    55,    86,   128,   132,
+     133,   133,   132,   134,   132,   135,   135,   135,    25,   134,
+     135,    45,    47,    36,    36,    49,    48,    49,    36,    41,
+      41,    37,    41,    36,    36,    41,    36,    41,    41,    41,
+     132,    49,    41,    18,    19,    21,    23,    24,    25,    26,
+      29,    31,    37,    38,    43,    50,    51,    54,   114,   120,
+     121,   124,   125,   131,   132,   133,   134,   135,   114,   120,
+     120,    84,   120,    79,    87,    87,   120,    45,    50,    90,
+      91,    92,   124,   134,   133,   120,   119,   120,   120,    87,
+      41,    45,   108,   109,   110,   111,   134,    25,    28,    30,
+      79,    95,    99,   100,   105,   112,    36,    87,   121,   124,
+     121,   120,   121,   121,    43,    37,    38,    39,    40,    46,
+      36,    45,    49,    49,    42,    79,    42,    29,    55,   114,
+     122,   123,   126,   127,   128,   134,    42,    48,    36,    49,
+      49,    42,    48,    49,    42,   110,    38,    53,    54,   129,
+     130,    42,    48,    42,    48,    36,    41,   135,    42,   100,
+     120,    42,    44,   118,   119,   120,   120,   120,   120,   120,
+     120,    49,    49,    43,    46,    48,    46,    48,    49,    91,
+      92,   120,    49,   120,    49,    42,   130,    48,    49,   109,
+      49,   111,    41,   120,    27,    79,   101,   102,    41,    49,
+      49,    49,    44,    46,   118,   123,   128,   129,   110,    41,
+      42,   102,   106,   107,   133,    44,    46,    42,    41,   103,
+     104,   133,    49,    42,    48,    36,   119,    42,    48,    49,
+     107,   133,    42,    49,   104
+};
+
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                (-2)
+#define YYEOF          0
+
+#define YYACCEPT       goto yyacceptlab
+#define YYABORT                goto yyabortlab
+#define YYERROR                goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+
+#define YYFAIL         goto yyerrlab
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)                                 \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    {                                                          \
+      yychar = (Token);                                                \
+      yylval = (Value);                                                \
+      yytoken = YYTRANSLATE (yychar);                          \
+      YYPOPSTACK (1);                                          \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    {                                                          \
+      yyerror (YY_("syntax error: cannot back up")); \
+      YYERROR;                                                 \
+    }                                                          \
+while (YYID (0))
+
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+   If N is 0, then set CURRENT to the empty location which ends
+   the previous symbol: RHS[0] (always defined).  */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)                               \
+    do                                                                 \
+      if (YYID (N))                                                    \
+       {                                                               \
+         (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
+         (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
+         (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
+         (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
+       }                                                               \
+      else                                                             \
+       {                                                               \
+         (Current).first_line   = (Current).last_line   =              \
+           YYRHSLOC (Rhs, 0).last_line;                                \
+         (Current).first_column = (Current).last_column =              \
+           YYRHSLOC (Rhs, 0).last_column;                              \
+       }                                                               \
+    while (YYID (0))
+#endif
+
+
+/* YY_LOCATION_PRINT -- Print the location on the stream.
+   This macro was not mandated originally: define only if we know
+   we won't break user code: when these are the locations we know.  */
+
+#ifndef YY_LOCATION_PRINT
+# if YYLTYPE_IS_TRIVIAL
+#  define YY_LOCATION_PRINT(File, Loc)                 \
+     fprintf (File, "%d.%d-%d.%d",                     \
+             (Loc).first_line, (Loc).first_column,     \
+             (Loc).last_line,  (Loc).last_column)
+# else
+#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)                       \
+do {                                           \
+  if (yydebug)                                 \
+    YYFPRINTF Args;                            \
+} while (YYID (0))
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                   \
+do {                                                                     \
+  if (yydebug)                                                           \
+    {                                                                    \
+      YYFPRINTF (stderr, "%s ", Title);                                          \
+      yy_symbol_print (stderr,                                           \
+                 Type, Value); \
+      YYFPRINTF (stderr, "\n");                                                  \
+    }                                                                    \
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (!yyvaluep)
+    return;
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+  YYUSE (yyoutput);
+# endif
+  switch (yytype)
+    {
+      default:
+       break;
+    }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (yytype < YYNTOKENS)
+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  yy_symbol_value_print (yyoutput, yytype, yyvaluep);
+  YYFPRINTF (yyoutput, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included).                                                   |
+`------------------------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
+#else
+static void
+yy_stack_print (bottom, top)
+    yytype_int16 *bottom;
+    yytype_int16 *top;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (; bottom <= top; ++bottom)
+    YYFPRINTF (stderr, " %d", *bottom);
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)                           \
+do {                                                           \
+  if (yydebug)                                                 \
+    yy_stack_print ((Bottom), (Top));                          \
+} while (YYID (0))
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
+#else
+static void
+yy_reduce_print (yyvsp, yyrule)
+    YYSTYPE *yyvsp;
+    int yyrule;
+#endif
+{
+  int yynrhs = yyr2[yyrule];
+  int yyi;
+  unsigned long int yylno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+            yyrule - 1, yylno);
+  /* The symbols being reduced.  */
+  for (yyi = 0; yyi < yynrhs; yyi++)
+    {
+      fprintf (stderr, "   $%d = ", yyi + 1);
+      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+                      &(yyvsp[(yyi + 1) - (yynrhs)])
+                                      );
+      fprintf (stderr, "\n");
+    }
+}
+
+# define YY_REDUCE_PRINT(Rule)         \
+do {                                   \
+  if (yydebug)                         \
+    yy_reduce_print (yyvsp, Rule); \
+} while (YYID (0))
+
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef        YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+\f
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined __GLIBC__ && defined _STRING_H
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static YYSIZE_T
+yystrlen (const char *yystr)
+#else
+static YYSIZE_T
+yystrlen (yystr)
+    const char *yystr;
+#endif
+{
+  YYSIZE_T yylen;
+  for (yylen = 0; yystr[yylen]; yylen++)
+    continue;
+  return yylen;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+#else
+static char *
+yystpcpy (yydest, yysrc)
+    char *yydest;
+    const char *yysrc;
+#endif
+{
+  char *yyd = yydest;
+  const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+   quotes and backslashes, so that it's suitable for yyerror.  The
+   heuristic is that double-quoting is unnecessary unless the string
+   contains an apostrophe, a comma, or backslash (other than
+   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
+   null, do not copy; instead, return the length of what the result
+   would have been.  */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+  if (*yystr == '"')
+    {
+      YYSIZE_T yyn = 0;
+      char const *yyp = yystr;
+
+      for (;;)
+       switch (*++yyp)
+         {
+         case '\'':
+         case ',':
+           goto do_not_strip_quotes;
+
+         case '\\':
+           if (*++yyp != '\\')
+             goto do_not_strip_quotes;
+           /* Fall through.  */
+         default:
+           if (yyres)
+             yyres[yyn] = *yyp;
+           yyn++;
+           break;
+
+         case '"':
+           if (yyres)
+             yyres[yyn] = '\0';
+           return yyn;
+         }
+    do_not_strip_quotes: ;
+    }
+
+  if (! yyres)
+    return yystrlen (yystr);
+
+  return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
+/* Copy into YYRESULT an error message about the unexpected token
+   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
+   including the terminating null byte.  If YYRESULT is null, do not
+   copy anything; just return the number of bytes that would be
+   copied.  As a special case, return 0 if an ordinary "syntax error"
+   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
+   size calculation.  */
+static YYSIZE_T
+yysyntax_error (char *yyresult, int yystate, int yychar)
+{
+  int yyn = yypact[yystate];
+
+  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
+    return 0;
+  else
+    {
+      int yytype = YYTRANSLATE (yychar);
+      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+      YYSIZE_T yysize = yysize0;
+      YYSIZE_T yysize1;
+      int yysize_overflow = 0;
+      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+      int yyx;
+
+# if 0
+      /* This is so xgettext sees the translatable formats that are
+        constructed on the fly.  */
+      YY_("syntax error, unexpected %s");
+      YY_("syntax error, unexpected %s, expecting %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+# endif
+      char *yyfmt;
+      char const *yyf;
+      static char const yyunexpected[] = "syntax error, unexpected %s";
+      static char const yyexpecting[] = ", expecting %s";
+      static char const yyor[] = " or %s";
+      char yyformat[sizeof yyunexpected
+                   + sizeof yyexpecting - 1
+                   + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+                      * (sizeof yyor - 1))];
+      char const *yyprefix = yyexpecting;
+
+      /* Start YYX at -YYN if negative to avoid negative indexes in
+        YYCHECK.  */
+      int yyxbegin = yyn < 0 ? -yyn : 0;
+
+      /* Stay within bounds of both yycheck and yytname.  */
+      int yychecklim = YYLAST - yyn + 1;
+      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+      int yycount = 1;
+
+      yyarg[0] = yytname[yytype];
+      yyfmt = yystpcpy (yyformat, yyunexpected);
+
+      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+       if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+         {
+           if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+             {
+               yycount = 1;
+               yysize = yysize0;
+               yyformat[sizeof yyunexpected - 1] = '\0';
+               break;
+             }
+           yyarg[yycount++] = yytname[yyx];
+           yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+           yysize_overflow |= (yysize1 < yysize);
+           yysize = yysize1;
+           yyfmt = yystpcpy (yyfmt, yyprefix);
+           yyprefix = yyor;
+         }
+
+      yyf = YY_(yyformat);
+      yysize1 = yysize + yystrlen (yyf);
+      yysize_overflow |= (yysize1 < yysize);
+      yysize = yysize1;
+
+      if (yysize_overflow)
+       return YYSIZE_MAXIMUM;
+
+      if (yyresult)
+       {
+         /* Avoid sprintf, as that infringes on the user's name space.
+            Don't have undefined behavior even if the translation
+            produced a string with the wrong number of "%s"s.  */
+         char *yyp = yyresult;
+         int yyi = 0;
+         while ((*yyp = *yyf) != '\0')
+           {
+             if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+               {
+                 yyp += yytnamerr (yyp, yyarg[yyi++]);
+                 yyf += 2;
+               }
+             else
+               {
+                 yyp++;
+                 yyf++;
+               }
+           }
+       }
+      return yysize;
+    }
+}
+#endif /* YYERROR_VERBOSE */
+\f
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yymsg, yytype, yyvaluep)
+    const char *yymsg;
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  YYUSE (yyvaluep);
+
+  if (!yymsg)
+    yymsg = "Deleting";
+  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+  switch (yytype)
+    {
+
+      default:
+       break;
+    }
+}
+\f
+
+/* Prevent warnings from -Wmissing-prototypes.  */
+
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void *YYPARSE_PARAM);
+#else
+int yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+
+/* The look-ahead symbol.  */
+int yychar;
+
+/* The semantic value of the look-ahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far.  */
+int yynerrs;
+
+
+
+/*----------.
+| yyparse.  |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+    void *YYPARSE_PARAM;
+#endif
+#else /* ! YYPARSE_PARAM */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
+{
+  
+  int yystate;
+  int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Look-ahead token as an internal (translated) token number.  */
+  int yytoken = 0;
+#if YYERROR_VERBOSE
+  /* Buffer for error messages, and its allocated size.  */
+  char yymsgbuf[128];
+  char *yymsg = yymsgbuf;
+  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack.  */
+  yytype_int16 yyssa[YYINITDEPTH];
+  yytype_int16 *yyss = yyssa;
+  yytype_int16 *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+
+  /* The number of symbols on the RHS of the reduced rule.
+     Keep to zero when no symbol should be popped.  */
+  int yylen = 0;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;            /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed.  So pushing a state here evens the stacks.  */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyss + yystacksize - 1 <= yyssp)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+       /* Give user a chance to reallocate the stack.  Use copies of
+          these so that the &'s don't force the real ones into
+          memory.  */
+       YYSTYPE *yyvs1 = yyvs;
+       yytype_int16 *yyss1 = yyss;
+
+
+       /* Each stack pointer address is followed by the size of the
+          data in use in that stack, in bytes.  This used to be a
+          conditional around just the two extra args, but that might
+          be undefined if yyoverflow is a macro.  */
+       yyoverflow (YY_("memory exhausted"),
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+
+                   &yystacksize);
+
+       yyss = yyss1;
+       yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyexhaustedlab;
+# else
+      /* Extend the stack our own way.  */
+      if (YYMAXDEPTH <= yystacksize)
+       goto yyexhaustedlab;
+      yystacksize *= 2;
+      if (YYMAXDEPTH < yystacksize)
+       yystacksize = YYMAXDEPTH;
+
+      {
+       yytype_int16 *yyss1 = yyss;
+       union yyalloc *yyptr =
+         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+       if (! yyptr)
+         goto yyexhaustedlab;
+       YYSTACK_RELOCATE (yyss);
+       YYSTACK_RELOCATE (yyvs);
+
+#  undef YYSTACK_RELOCATE
+       if (yyss1 != yyssa)
+         YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+                 (unsigned long int) yystacksize));
+
+      if (yyss + yystacksize - 1 <= yyssp)
+       YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+  /* Do appropriate processing given the current state.  Read a
+     look-ahead token if we need one and don't already have one.  */
+
+  /* First try to decide what to do without reference to look-ahead token.  */
+  yyn = yypact[yystate];
+  if (yyn == YYPACT_NINF)
+    goto yydefault;
+
+  /* Not known => get a look-ahead token if don't already have one.  */
+
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  if (yychar <= YYEOF)
+    {
+      yychar = yytoken = YYEOF;
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yytoken = YYTRANSLATE (yychar);
+      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+    }
+
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
+     detect an error, take that action.  */
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yyn == 0 || yyn == YYTABLE_NINF)
+       goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  /* Shift the look-ahead token.  */
+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+  /* Discard the shifted token unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  yystate = yyn;
+  *++yyvsp = yylval;
+
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+  YY_REDUCE_PRINT (yyn);
+  switch (yyn)
+    {
+        case 2:
+#line 169 "xkbparse.y"
+    { (yyval.file)= rtrnValue= (yyvsp[(1) - (1)].file); }
+    break;
+
+  case 3:
+#line 171 "xkbparse.y"
+    { (yyval.file)= rtrnValue= (yyvsp[(1) - (1)].file);  }
+    break;
+
+  case 4:
+#line 173 "xkbparse.y"
+    { (yyval.file)= rtrnValue= (yyvsp[(1) - (1)].file); }
+    break;
+
+  case 5:
+#line 177 "xkbparse.y"
+    { (yyval.file)= (XkbFile *)AppendStmt(&(yyvsp[(1) - (2)].file)->common,&(yyvsp[(2) - (2)].file)->common); }
+    break;
+
+  case 6:
+#line 179 "xkbparse.y"
+    { (yyval.file)= (yyvsp[(1) - (1)].file); }
+    break;
+
+  case 7:
+#line 185 "xkbparse.y"
+    { (yyval.file)= CreateXKBFile((yyvsp[(2) - (7)].uval),(yyvsp[(3) - (7)].str),&(yyvsp[(5) - (7)].file)->common,(yyvsp[(1) - (7)].uval)); }
+    break;
+
+  case 8:
+#line 188 "xkbparse.y"
+    { (yyval.uval)= XkmKeymapFile; }
+    break;
+
+  case 9:
+#line 189 "xkbparse.y"
+    { (yyval.uval)= XkmSemanticsFile; }
+    break;
+
+  case 10:
+#line 190 "xkbparse.y"
+    { (yyval.uval)= XkmLayoutFile; }
+    break;
+
+  case 11:
+#line 194 "xkbparse.y"
+    { (yyval.file)= (XkbFile *)AppendStmt(&(yyvsp[(1) - (2)].file)->common,&(yyvsp[(2) - (2)].file)->common); }
+    break;
+
+  case 12:
+#line 196 "xkbparse.y"
+    { (yyval.file)= (yyvsp[(1) - (1)].file); }
+    break;
+
+  case 13:
+#line 202 "xkbparse.y"
+    { (yyval.file)= CreateXKBFile((yyvsp[(2) - (7)].uval),(yyvsp[(3) - (7)].str),(yyvsp[(5) - (7)].any),(yyvsp[(1) - (7)].uval)); }
+    break;
+
+  case 14:
+#line 206 "xkbparse.y"
+    { (yyval.file)= CreateXKBFile((yyvsp[(2) - (4)].uval),(yyvsp[(3) - (4)].str),(yyvsp[(4) - (4)].any),(yyvsp[(1) - (4)].uval)); }
+    break;
+
+  case 15:
+#line 210 "xkbparse.y"
+    { (yyval.uval)= XkmKeyNamesIndex; }
+    break;
+
+  case 16:
+#line 211 "xkbparse.y"
+    { (yyval.uval)= XkmTypesIndex; }
+    break;
+
+  case 17:
+#line 212 "xkbparse.y"
+    { (yyval.uval)= XkmCompatMapIndex; }
+    break;
+
+  case 18:
+#line 213 "xkbparse.y"
+    { (yyval.uval)= XkmSymbolsIndex; }
+    break;
+
+  case 19:
+#line 214 "xkbparse.y"
+    { (yyval.uval)= XkmGeometryIndex; }
+    break;
+
+  case 20:
+#line 217 "xkbparse.y"
+    { (yyval.uval)= (yyvsp[(1) - (1)].uval); }
+    break;
+
+  case 21:
+#line 218 "xkbparse.y"
+    { (yyval.uval)= 0; }
+    break;
+
+  case 22:
+#line 221 "xkbparse.y"
+    { (yyval.uval)= (((yyvsp[(1) - (2)].uval))|((yyvsp[(2) - (2)].uval))); }
+    break;
+
+  case 23:
+#line 222 "xkbparse.y"
+    { (yyval.uval)= (yyvsp[(1) - (1)].uval); }
+    break;
+
+  case 24:
+#line 225 "xkbparse.y"
+    { (yyval.uval)= XkbLC_Partial; }
+    break;
+
+  case 25:
+#line 226 "xkbparse.y"
+    { (yyval.uval)= XkbLC_Default; }
+    break;
+
+  case 26:
+#line 227 "xkbparse.y"
+    { (yyval.uval)= XkbLC_Hidden; }
+    break;
+
+  case 27:
+#line 228 "xkbparse.y"
+    { (yyval.uval)= XkbLC_AlphanumericKeys; }
+    break;
+
+  case 28:
+#line 229 "xkbparse.y"
+    { (yyval.uval)= XkbLC_ModifierKeys; }
+    break;
+
+  case 29:
+#line 230 "xkbparse.y"
+    { (yyval.uval)= XkbLC_KeypadKeys; }
+    break;
+
+  case 30:
+#line 231 "xkbparse.y"
+    { (yyval.uval)= XkbLC_FunctionKeys; }
+    break;
+
+  case 31:
+#line 232 "xkbparse.y"
+    { (yyval.uval)= XkbLC_AlternateGroup; }
+    break;
+
+  case 32:
+#line 236 "xkbparse.y"
+    { (yyval.any)= AppendStmt((yyvsp[(1) - (2)].any),(yyvsp[(2) - (2)].any)); }
+    break;
+
+  case 33:
+#line 237 "xkbparse.y"
+    { (yyval.any)= NULL; }
+    break;
+
+  case 34:
+#line 241 "xkbparse.y"
+    {
+                           (yyvsp[(2) - (2)].var)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].var)->common,(yyvsp[(1) - (2)].uval));
+                           (yyval.any)= &(yyvsp[(2) - (2)].var)->common;
+                       }
+    break;
+
+  case 35:
+#line 246 "xkbparse.y"
+    {
+                           (yyvsp[(2) - (2)].vmod)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].vmod)->common,(yyvsp[(1) - (2)].uval));
+                           (yyval.any)= &(yyvsp[(2) - (2)].vmod)->common;
+                       }
+    break;
+
+  case 36:
+#line 251 "xkbparse.y"
+    {
+                           (yyvsp[(2) - (2)].interp)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].interp)->common,(yyvsp[(1) - (2)].uval));
+                           (yyval.any)= &(yyvsp[(2) - (2)].interp)->common;
+                       }
+    break;
+
+  case 37:
+#line 256 "xkbparse.y"
+    {
+                           (yyvsp[(2) - (2)].keyName)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].keyName)->common,(yyvsp[(1) - (2)].uval));
+                           (yyval.any)= &(yyvsp[(2) - (2)].keyName)->common;
+                       }
+    break;
+
+  case 38:
+#line 261 "xkbparse.y"
+    {
+                           (yyvsp[(2) - (2)].keyAlias)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].keyAlias)->common,(yyvsp[(1) - (2)].uval));
+                           (yyval.any)= &(yyvsp[(2) - (2)].keyAlias)->common;
+                       }
+    break;
+
+  case 39:
+#line 266 "xkbparse.y"
+    {
+                           (yyvsp[(2) - (2)].keyType)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].keyType)->common,(yyvsp[(1) - (2)].uval));
+                           (yyval.any)= &(yyvsp[(2) - (2)].keyType)->common;
+                       }
+    break;
+
+  case 40:
+#line 271 "xkbparse.y"
+    {
+                           (yyvsp[(2) - (2)].syms)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].syms)->common,(yyvsp[(1) - (2)].uval));
+                           (yyval.any)= &(yyvsp[(2) - (2)].syms)->common;
+                       }
+    break;
+
+  case 41:
+#line 276 "xkbparse.y"
+    {
+                           (yyvsp[(2) - (2)].modMask)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].modMask)->common,(yyvsp[(1) - (2)].uval));
+                           (yyval.any)= &(yyvsp[(2) - (2)].modMask)->common;
+                       }
+    break;
+
+  case 42:
+#line 281 "xkbparse.y"
+    {
+                           (yyvsp[(2) - (2)].groupCompat)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].groupCompat)->common,(yyvsp[(1) - (2)].uval));
+                           (yyval.any)= &(yyvsp[(2) - (2)].groupCompat)->common;
+                       }
+    break;
+
+  case 43:
+#line 286 "xkbparse.y"
+    {
+                           (yyvsp[(2) - (2)].ledMap)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].ledMap)->common,(yyvsp[(1) - (2)].uval));
+                           (yyval.any)= &(yyvsp[(2) - (2)].ledMap)->common;
+                       }
+    break;
+
+  case 44:
+#line 291 "xkbparse.y"
+    {
+                           (yyvsp[(2) - (2)].ledName)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].ledName)->common,(yyvsp[(1) - (2)].uval));
+                           (yyval.any)= &(yyvsp[(2) - (2)].ledName)->common;
+                       }
+    break;
+
+  case 45:
+#line 296 "xkbparse.y"
+    {
+                           (yyvsp[(2) - (2)].shape)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].shape)->common,(yyvsp[(1) - (2)].uval));
+                           (yyval.any)= &(yyvsp[(2) - (2)].shape)->common;
+                       }
+    break;
+
+  case 46:
+#line 301 "xkbparse.y"
+    {
+                           (yyvsp[(2) - (2)].section)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].section)->common,(yyvsp[(1) - (2)].uval));
+                           (yyval.any)= &(yyvsp[(2) - (2)].section)->common;
+                       }
+    break;
+
+  case 47:
+#line 306 "xkbparse.y"
+    {
+                           (yyvsp[(2) - (2)].doodad)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].doodad)->common,(yyvsp[(1) - (2)].uval));
+                           (yyval.any)= &(yyvsp[(2) - (2)].doodad)->common;
+                       }
+    break;
+
+  case 48:
+#line 311 "xkbparse.y"
+    {
+                           if ((yyvsp[(1) - (2)].uval)==MergeAltForm) {
+                               yyerror("cannot use 'alternate' to include other maps");
+                               (yyval.any)= &IncludeCreate(scanBuf,MergeDefault)->common;
+                           }
+                           else {
+                               (yyval.any)= &IncludeCreate(scanBuf,(yyvsp[(1) - (2)].uval))->common;
+                           }
+                        }
+    break;
+
+  case 49:
+#line 323 "xkbparse.y"
+    { (yyval.var)= VarCreate((yyvsp[(1) - (4)].expr),(yyvsp[(3) - (4)].expr)); }
+    break;
+
+  case 50:
+#line 325 "xkbparse.y"
+    { (yyval.var)= BoolVarCreate((yyvsp[(1) - (2)].sval),1); }
+    break;
+
+  case 51:
+#line 327 "xkbparse.y"
+    { (yyval.var)= BoolVarCreate((yyvsp[(2) - (3)].sval),0); }
+    break;
+
+  case 52:
+#line 331 "xkbparse.y"
+    {
+                           KeycodeDef *def;
+
+                           def= KeycodeCreate((yyvsp[(1) - (4)].str),(yyvsp[(3) - (4)].expr));
+                           if ((yyvsp[(1) - (4)].str))
+                               free((yyvsp[(1) - (4)].str));
+                           (yyval.keyName)= def;
+                       }
+    break;
+
+  case 53:
+#line 342 "xkbparse.y"
+    { 
+                           KeyAliasDef *def;
+                           def= KeyAliasCreate((yyvsp[(2) - (5)].str),(yyvsp[(4) - (5)].str)); 
+                           if ((yyvsp[(2) - (5)].str)) free((yyvsp[(2) - (5)].str));   
+                           if ((yyvsp[(4) - (5)].str)) free((yyvsp[(4) - (5)].str));   
+                           (yyval.keyAlias)= def;
+                       }
+    break;
+
+  case 54:
+#line 352 "xkbparse.y"
+    { (yyval.vmod)= (yyvsp[(2) - (3)].vmod); }
+    break;
+
+  case 55:
+#line 356 "xkbparse.y"
+    { (yyval.vmod)= (VModDef *)AppendStmt(&(yyvsp[(1) - (3)].vmod)->common,&(yyvsp[(3) - (3)].vmod)->common); }
+    break;
+
+  case 56:
+#line 358 "xkbparse.y"
+    { (yyval.vmod)= (yyvsp[(1) - (1)].vmod); }
+    break;
+
+  case 57:
+#line 362 "xkbparse.y"
+    { (yyval.vmod)= VModCreate((yyvsp[(1) - (1)].sval),NULL); }
+    break;
+
+  case 58:
+#line 364 "xkbparse.y"
+    { (yyval.vmod)= VModCreate((yyvsp[(1) - (3)].sval),(yyvsp[(3) - (3)].expr)); }
+    break;
+
+  case 59:
+#line 370 "xkbparse.y"
+    {
+                           (yyvsp[(2) - (6)].interp)->def= (yyvsp[(4) - (6)].var);
+                           (yyval.interp)= (yyvsp[(2) - (6)].interp);
+                       }
+    break;
+
+  case 60:
+#line 377 "xkbparse.y"
+    { (yyval.interp)= InterpCreate((yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].expr)); }
+    break;
+
+  case 61:
+#line 379 "xkbparse.y"
+    { (yyval.interp)= InterpCreate((yyvsp[(1) - (1)].str), NULL); }
+    break;
+
+  case 62:
+#line 383 "xkbparse.y"
+    { (yyval.var)= (VarDef *)AppendStmt(&(yyvsp[(1) - (2)].var)->common,&(yyvsp[(2) - (2)].var)->common); }
+    break;
+
+  case 63:
+#line 385 "xkbparse.y"
+    { (yyval.var)= (yyvsp[(1) - (1)].var); }
+    break;
+
+  case 64:
+#line 391 "xkbparse.y"
+    { (yyval.keyType)= KeyTypeCreate((yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].var)); }
+    break;
+
+  case 65:
+#line 397 "xkbparse.y"
+    { (yyval.syms)= SymbolsCreate((yyvsp[(2) - (6)].str),(ExprDef *)(yyvsp[(4) - (6)].var)); }
+    break;
+
+  case 66:
+#line 401 "xkbparse.y"
+    { (yyval.var)= (VarDef *)AppendStmt(&(yyvsp[(1) - (3)].var)->common,&(yyvsp[(3) - (3)].var)->common); }
+    break;
+
+  case 67:
+#line 403 "xkbparse.y"
+    { (yyval.var)= (yyvsp[(1) - (1)].var); }
+    break;
+
+  case 68:
+#line 404 "xkbparse.y"
+    { (yyval.var)= NULL; }
+    break;
+
+  case 69:
+#line 408 "xkbparse.y"
+    { (yyval.var)= VarCreate((yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); }
+    break;
+
+  case 70:
+#line 410 "xkbparse.y"
+    { (yyval.var)= VarCreate((yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); }
+    break;
+
+  case 71:
+#line 412 "xkbparse.y"
+    { (yyval.var)= BoolVarCreate((yyvsp[(1) - (1)].sval),1); }
+    break;
+
+  case 72:
+#line 414 "xkbparse.y"
+    { (yyval.var)= BoolVarCreate((yyvsp[(2) - (2)].sval),0); }
+    break;
+
+  case 73:
+#line 416 "xkbparse.y"
+    { (yyval.var)= VarCreate(NULL,(yyvsp[(1) - (1)].expr)); }
+    break;
+
+  case 74:
+#line 420 "xkbparse.y"
+    { (yyval.expr)= (yyvsp[(2) - (3)].expr); }
+    break;
+
+  case 75:
+#line 422 "xkbparse.y"
+    { (yyval.expr)= ExprCreateUnary(ExprActionList,TypeAction,(yyvsp[(2) - (3)].expr)); }
+    break;
+
+  case 76:
+#line 426 "xkbparse.y"
+    { (yyval.groupCompat)= GroupCompatCreate((yyvsp[(2) - (5)].ival),(yyvsp[(4) - (5)].expr)); }
+    break;
+
+  case 77:
+#line 430 "xkbparse.y"
+    { (yyval.modMask)= ModMapCreate((yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].expr)); }
+    break;
+
+  case 78:
+#line 434 "xkbparse.y"
+    { (yyval.ledMap)= IndicatorMapCreate((yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].var)); }
+    break;
+
+  case 79:
+#line 438 "xkbparse.y"
+    { (yyval.ledName)= IndicatorNameCreate((yyvsp[(2) - (5)].ival),(yyvsp[(4) - (5)].expr),False); }
+    break;
+
+  case 80:
+#line 440 "xkbparse.y"
+    { (yyval.ledName)= IndicatorNameCreate((yyvsp[(3) - (6)].ival),(yyvsp[(5) - (6)].expr),True); }
+    break;
+
+  case 81:
+#line 444 "xkbparse.y"
+    { (yyval.shape)= ShapeDeclCreate((yyvsp[(2) - (6)].sval),(OutlineDef *)&(yyvsp[(4) - (6)].outline)->common); }
+    break;
+
+  case 82:
+#line 446 "xkbparse.y"
+    { 
+                           OutlineDef *outlines;
+                           outlines= OutlineCreate(None,(yyvsp[(4) - (6)].expr));
+                           (yyval.shape)= ShapeDeclCreate((yyvsp[(2) - (6)].sval),outlines);
+                       }
+    break;
+
+  case 83:
+#line 454 "xkbparse.y"
+    { (yyval.section)= SectionDeclCreate((yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].row)); }
+    break;
+
+  case 84:
+#line 458 "xkbparse.y"
+    { (yyval.row)=(RowDef *)AppendStmt(&(yyvsp[(1) - (2)].row)->common,&(yyvsp[(2) - (2)].row)->common);}
+    break;
+
+  case 85:
+#line 460 "xkbparse.y"
+    { (yyval.row)= (yyvsp[(1) - (1)].row); }
+    break;
+
+  case 86:
+#line 464 "xkbparse.y"
+    { (yyval.row)= RowDeclCreate((yyvsp[(3) - (5)].key)); }
+    break;
+
+  case 87:
+#line 466 "xkbparse.y"
+    { (yyval.row)= (RowDef *)(yyvsp[(1) - (1)].var); }
+    break;
+
+  case 88:
+#line 468 "xkbparse.y"
+    { (yyval.row)= (RowDef *)(yyvsp[(1) - (1)].doodad); }
+    break;
+
+  case 89:
+#line 470 "xkbparse.y"
+    { (yyval.row)= (RowDef *)(yyvsp[(1) - (1)].ledMap); }
+    break;
+
+  case 90:
+#line 472 "xkbparse.y"
+    { (yyval.row)= (RowDef *)(yyvsp[(1) - (1)].overlay); }
+    break;
+
+  case 91:
+#line 476 "xkbparse.y"
+    { (yyval.key)=(KeyDef *)AppendStmt(&(yyvsp[(1) - (2)].key)->common,&(yyvsp[(2) - (2)].key)->common);}
+    break;
+
+  case 92:
+#line 478 "xkbparse.y"
+    { (yyval.key)= (yyvsp[(1) - (1)].key); }
+    break;
+
+  case 93:
+#line 482 "xkbparse.y"
+    { (yyval.key)= (yyvsp[(3) - (5)].key); }
+    break;
+
+  case 94:
+#line 484 "xkbparse.y"
+    { (yyval.key)= (KeyDef *)(yyvsp[(1) - (1)].var); }
+    break;
+
+  case 95:
+#line 488 "xkbparse.y"
+    { (yyval.key)=(KeyDef *)AppendStmt(&(yyvsp[(1) - (3)].key)->common,&(yyvsp[(3) - (3)].key)->common);}
+    break;
+
+  case 96:
+#line 490 "xkbparse.y"
+    { (yyval.key)= (yyvsp[(1) - (1)].key); }
+    break;
+
+  case 97:
+#line 494 "xkbparse.y"
+    { (yyval.key)= KeyDeclCreate((yyvsp[(1) - (1)].str),NULL); }
+    break;
+
+  case 98:
+#line 496 "xkbparse.y"
+    { (yyval.key)= KeyDeclCreate(NULL,(yyvsp[(2) - (3)].expr)); }
+    break;
+
+  case 99:
+#line 500 "xkbparse.y"
+    { (yyval.overlay)= OverlayDeclCreate((yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].olKey)); }
+    break;
+
+  case 100:
+#line 504 "xkbparse.y"
+    { 
+                           (yyval.olKey)= (OverlayKeyDef *)
+                               AppendStmt(&(yyvsp[(1) - (3)].olKey)->common,&(yyvsp[(3) - (3)].olKey)->common);
+                       }
+    break;
+
+  case 101:
+#line 509 "xkbparse.y"
+    { (yyval.olKey)= (yyvsp[(1) - (1)].olKey); }
+    break;
+
+  case 102:
+#line 513 "xkbparse.y"
+    { (yyval.olKey)= OverlayKeyCreate((yyvsp[(1) - (3)].str),(yyvsp[(3) - (3)].str)); }
+    break;
+
+  case 103:
+#line 517 "xkbparse.y"
+    { (yyval.outline)=(OutlineDef *)AppendStmt(&(yyvsp[(1) - (3)].outline)->common,&(yyvsp[(3) - (3)].outline)->common);}
+    break;
+
+  case 104:
+#line 519 "xkbparse.y"
+    { (yyval.outline)= (yyvsp[(1) - (1)].outline); }
+    break;
+
+  case 105:
+#line 523 "xkbparse.y"
+    { (yyval.outline)= OutlineCreate(None,(yyvsp[(2) - (3)].expr)); }
+    break;
+
+  case 106:
+#line 525 "xkbparse.y"
+    { (yyval.outline)= OutlineCreate((yyvsp[(1) - (5)].sval),(yyvsp[(4) - (5)].expr)); }
+    break;
+
+  case 107:
+#line 527 "xkbparse.y"
+    { (yyval.outline)= OutlineCreate((yyvsp[(1) - (3)].sval),(yyvsp[(3) - (3)].expr)); }
+    break;
+
+  case 108:
+#line 531 "xkbparse.y"
+    { (yyval.expr)= (ExprDef *)AppendStmt(&(yyvsp[(1) - (3)].expr)->common,&(yyvsp[(3) - (3)].expr)->common); }
+    break;
+
+  case 109:
+#line 533 "xkbparse.y"
+    { (yyval.expr)= (yyvsp[(1) - (1)].expr); }
+    break;
+
+  case 110:
+#line 537 "xkbparse.y"
+    {
+                           ExprDef *expr;
+                           expr= ExprCreate(ExprCoord,TypeUnknown);
+                           expr->value.coord.x= (yyvsp[(2) - (5)].ival);
+                           expr->value.coord.y= (yyvsp[(4) - (5)].ival);
+                           (yyval.expr)= expr;
+                       }
+    break;
+
+  case 111:
+#line 547 "xkbparse.y"
+    { (yyval.doodad)= DoodadCreate((yyvsp[(1) - (6)].uval),(yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].var)); }
+    break;
+
+  case 112:
+#line 550 "xkbparse.y"
+    { (yyval.uval)= XkbTextDoodad; }
+    break;
+
+  case 113:
+#line 551 "xkbparse.y"
+    { (yyval.uval)= XkbOutlineDoodad; }
+    break;
+
+  case 114:
+#line 552 "xkbparse.y"
+    { (yyval.uval)= XkbSolidDoodad; }
+    break;
+
+  case 115:
+#line 553 "xkbparse.y"
+    { (yyval.uval)= XkbLogoDoodad; }
+    break;
+
+  case 116:
+#line 556 "xkbparse.y"
+    { (yyval.sval)= (yyvsp[(1) - (1)].sval); }
+    break;
+
+  case 117:
+#line 557 "xkbparse.y"
+    { (yyval.sval)= (yyvsp[(1) - (1)].sval); }
+    break;
+
+  case 118:
+#line 561 "xkbparse.y"
+    { (yyval.sval)= XkbInternAtom(NULL,"action",False); }
+    break;
+
+  case 119:
+#line 563 "xkbparse.y"
+    { (yyval.sval)= XkbInternAtom(NULL,"interpret",False); }
+    break;
+
+  case 120:
+#line 565 "xkbparse.y"
+    { (yyval.sval)= XkbInternAtom(NULL,"type",False); }
+    break;
+
+  case 121:
+#line 567 "xkbparse.y"
+    { (yyval.sval)= XkbInternAtom(NULL,"key",False); }
+    break;
+
+  case 122:
+#line 569 "xkbparse.y"
+    { (yyval.sval)= XkbInternAtom(NULL,"group",False); }
+    break;
+
+  case 123:
+#line 571 "xkbparse.y"
+    {(yyval.sval)=XkbInternAtom(NULL,"modifier_map",False);}
+    break;
+
+  case 124:
+#line 573 "xkbparse.y"
+    { (yyval.sval)= XkbInternAtom(NULL,"indicator",False); }
+    break;
+
+  case 125:
+#line 575 "xkbparse.y"
+    { (yyval.sval)= XkbInternAtom(NULL,"shape",False); }
+    break;
+
+  case 126:
+#line 577 "xkbparse.y"
+    { (yyval.sval)= XkbInternAtom(NULL,"row",False); }
+    break;
+
+  case 127:
+#line 579 "xkbparse.y"
+    { (yyval.sval)= XkbInternAtom(NULL,"section",False); }
+    break;
+
+  case 128:
+#line 581 "xkbparse.y"
+    { (yyval.sval)= XkbInternAtom(NULL,"text",False); }
+    break;
+
+  case 129:
+#line 584 "xkbparse.y"
+    { (yyval.uval)= (yyvsp[(1) - (1)].uval); }
+    break;
+
+  case 130:
+#line 585 "xkbparse.y"
+    { (yyval.uval)= MergeDefault; }
+    break;
+
+  case 131:
+#line 588 "xkbparse.y"
+    { (yyval.uval)= MergeDefault; }
+    break;
+
+  case 132:
+#line 589 "xkbparse.y"
+    { (yyval.uval)= MergeAugment; }
+    break;
+
+  case 133:
+#line 590 "xkbparse.y"
+    { (yyval.uval)= MergeOverride; }
+    break;
+
+  case 134:
+#line 591 "xkbparse.y"
+    { (yyval.uval)= MergeReplace; }
+    break;
+
+  case 135:
+#line 592 "xkbparse.y"
+    { (yyval.uval)= MergeAltForm; }
+    break;
+
+  case 136:
+#line 595 "xkbparse.y"
+    { (yyval.expr)= (yyvsp[(1) - (1)].expr); }
+    break;
+
+  case 137:
+#line 596 "xkbparse.y"
+    { (yyval.expr)= NULL; }
+    break;
+
+  case 138:
+#line 600 "xkbparse.y"
+    { (yyval.expr)= (ExprDef *)AppendStmt(&(yyvsp[(1) - (3)].expr)->common,&(yyvsp[(3) - (3)].expr)->common); }
+    break;
+
+  case 139:
+#line 602 "xkbparse.y"
+    { (yyval.expr)= (yyvsp[(1) - (1)].expr); }
+    break;
+
+  case 140:
+#line 606 "xkbparse.y"
+    { (yyval.expr)= ExprCreateBinary(OpDivide,(yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); }
+    break;
+
+  case 141:
+#line 608 "xkbparse.y"
+    { (yyval.expr)= ExprCreateBinary(OpAdd,(yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); }
+    break;
+
+  case 142:
+#line 610 "xkbparse.y"
+    { (yyval.expr)= ExprCreateBinary(OpSubtract,(yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); }
+    break;
+
+  case 143:
+#line 612 "xkbparse.y"
+    { (yyval.expr)= ExprCreateBinary(OpMultiply,(yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); }
+    break;
+
+  case 144:
+#line 614 "xkbparse.y"
+    { (yyval.expr)= ExprCreateBinary(OpAssign,(yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); }
+    break;
+
+  case 145:
+#line 616 "xkbparse.y"
+    { (yyval.expr)= (yyvsp[(1) - (1)].expr); }
+    break;
+
+  case 146:
+#line 620 "xkbparse.y"
+    { (yyval.expr)= ExprCreateUnary(OpNegate,(yyvsp[(2) - (2)].expr)->type,(yyvsp[(2) - (2)].expr)); }
+    break;
+
+  case 147:
+#line 622 "xkbparse.y"
+    { (yyval.expr)= ExprCreateUnary(OpUnaryPlus,(yyvsp[(2) - (2)].expr)->type,(yyvsp[(2) - (2)].expr)); }
+    break;
+
+  case 148:
+#line 624 "xkbparse.y"
+    { (yyval.expr)= ExprCreateUnary(OpNot,TypeBoolean,(yyvsp[(2) - (2)].expr)); }
+    break;
+
+  case 149:
+#line 626 "xkbparse.y"
+    { (yyval.expr)= ExprCreateUnary(OpInvert,(yyvsp[(2) - (2)].expr)->type,(yyvsp[(2) - (2)].expr)); }
+    break;
+
+  case 150:
+#line 628 "xkbparse.y"
+    { (yyval.expr)= (yyvsp[(1) - (1)].expr);  }
+    break;
+
+  case 151:
+#line 630 "xkbparse.y"
+    { (yyval.expr)= ActionCreate((yyvsp[(1) - (4)].sval),(yyvsp[(3) - (4)].expr)); }
+    break;
+
+  case 152:
+#line 632 "xkbparse.y"
+    { (yyval.expr)= (yyvsp[(1) - (1)].expr);  }
+    break;
+
+  case 153:
+#line 634 "xkbparse.y"
+    { (yyval.expr)= (yyvsp[(2) - (3)].expr);  }
+    break;
+
+  case 154:
+#line 638 "xkbparse.y"
+    { (yyval.expr)= (ExprDef *)AppendStmt(&(yyvsp[(1) - (3)].expr)->common,&(yyvsp[(3) - (3)].expr)->common); }
+    break;
+
+  case 155:
+#line 640 "xkbparse.y"
+    { (yyval.expr)= (yyvsp[(1) - (1)].expr); }
+    break;
+
+  case 156:
+#line 644 "xkbparse.y"
+    { (yyval.expr)= ActionCreate((yyvsp[(1) - (4)].sval),(yyvsp[(3) - (4)].expr)); }
+    break;
+
+  case 157:
+#line 648 "xkbparse.y"
+    {
+                           ExprDef *expr;
+                            expr= ExprCreate(ExprIdent,TypeUnknown);
+                            expr->value.str= (yyvsp[(1) - (1)].sval);
+                            (yyval.expr)= expr;
+                       }
+    break;
+
+  case 158:
+#line 655 "xkbparse.y"
+    {
+                            ExprDef *expr;
+                            expr= ExprCreate(ExprFieldRef,TypeUnknown);
+                            expr->value.field.element= (yyvsp[(1) - (3)].sval);
+                            expr->value.field.field= (yyvsp[(3) - (3)].sval);
+                            (yyval.expr)= expr;
+                       }
+    break;
+
+  case 159:
+#line 663 "xkbparse.y"
+    {
+                           ExprDef *expr;
+                           expr= ExprCreate(ExprArrayRef,TypeUnknown);
+                           expr->value.array.element= None;
+                           expr->value.array.field= (yyvsp[(1) - (4)].sval);
+                           expr->value.array.entry= (yyvsp[(3) - (4)].expr);
+                           (yyval.expr)= expr;
+                       }
+    break;
+
+  case 160:
+#line 672 "xkbparse.y"
+    {
+                           ExprDef *expr;
+                           expr= ExprCreate(ExprArrayRef,TypeUnknown);
+                           expr->value.array.element= (yyvsp[(1) - (6)].sval);
+                           expr->value.array.field= (yyvsp[(3) - (6)].sval);
+                           expr->value.array.entry= (yyvsp[(5) - (6)].expr);
+                           (yyval.expr)= expr;
+                       }
+    break;
+
+  case 161:
+#line 683 "xkbparse.y"
+    {
+                           ExprDef *expr;
+                            expr= ExprCreate(ExprValue,TypeString);
+                            expr->value.str= (yyvsp[(1) - (1)].sval);
+                            (yyval.expr)= expr;
+                       }
+    break;
+
+  case 162:
+#line 690 "xkbparse.y"
+    {
+                           ExprDef *expr;
+                            expr= ExprCreate(ExprValue,TypeInt);
+                            expr->value.ival= (yyvsp[(1) - (1)].ival);
+                            (yyval.expr)= expr;
+                       }
+    break;
+
+  case 163:
+#line 697 "xkbparse.y"
+    {
+                           ExprDef *expr;
+                           expr= ExprCreate(ExprValue,TypeFloat);
+                           expr->value.ival= (yyvsp[(1) - (1)].ival);
+                           (yyval.expr)= expr;
+                       }
+    break;
+
+  case 164:
+#line 704 "xkbparse.y"
+    {
+                           ExprDef *expr;
+                           expr= ExprCreate(ExprValue,TypeKeyName);
+                           memset(expr->value.keyName,0,5);
+                           strncpy(expr->value.keyName,(yyvsp[(1) - (1)].str),4);
+                           free((yyvsp[(1) - (1)].str));
+                           (yyval.expr)= expr;
+                       }
+    break;
+
+  case 165:
+#line 714 "xkbparse.y"
+    { (yyval.expr)= (yyvsp[(1) - (1)].expr); }
+    break;
+
+  case 166:
+#line 715 "xkbparse.y"
+    { (yyval.expr)= NULL; }
+    break;
+
+  case 167:
+#line 719 "xkbparse.y"
+    { (yyval.expr)= AppendKeysymList((yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].str)); }
+    break;
+
+  case 168:
+#line 721 "xkbparse.y"
+    { (yyval.expr)= CreateKeysymList((yyvsp[(1) - (1)].str)); }
+    break;
+
+  case 169:
+#line 724 "xkbparse.y"
+    { (yyval.str)= strdup(scanBuf); }
+    break;
+
+  case 170:
+#line 725 "xkbparse.y"
+    { (yyval.str)= strdup("section"); }
+    break;
+
+  case 171:
+#line 727 "xkbparse.y"
+    {
+                           if ((yyvsp[(1) - (1)].ival)<10)     { (yyval.str)= malloc(2); (yyval.str)[0]= '0' + (yyvsp[(1) - (1)].ival); (yyval.str)[1]= '\0'; }
+                           else        { (yyval.str)= malloc(19); snprintf((yyval.str), 19, "0x%x", (yyvsp[(1) - (1)].ival)); }
+                       }
+    break;
+
+  case 172:
+#line 733 "xkbparse.y"
+    { (yyval.ival)= -(yyvsp[(2) - (2)].ival); }
+    break;
+
+  case 173:
+#line 734 "xkbparse.y"
+    { (yyval.ival)= (yyvsp[(1) - (1)].ival); }
+    break;
+
+  case 174:
+#line 737 "xkbparse.y"
+    { (yyval.ival)= scanInt; }
+    break;
+
+  case 175:
+#line 738 "xkbparse.y"
+    { (yyval.ival)= scanInt*XkbGeomPtsPerMM; }
+    break;
+
+  case 176:
+#line 741 "xkbparse.y"
+    { (yyval.ival)= scanInt; }
+    break;
+
+  case 177:
+#line 744 "xkbparse.y"
+    { (yyval.ival)= scanInt; }
+    break;
+
+  case 178:
+#line 747 "xkbparse.y"
+    { (yyval.str)= strdup(scanBuf); }
+    break;
+
+  case 179:
+#line 750 "xkbparse.y"
+    { (yyval.sval)= XkbInternAtom(NULL,scanBuf,False); }
+    break;
+
+  case 180:
+#line 751 "xkbparse.y"
+    { (yyval.sval)= XkbInternAtom(NULL,"default",False); }
+    break;
+
+  case 181:
+#line 754 "xkbparse.y"
+    { (yyval.sval)= XkbInternAtom(NULL,scanBuf,False); }
+    break;
+
+  case 182:
+#line 757 "xkbparse.y"
+    { (yyval.str)= (yyvsp[(1) - (1)].str); }
+    break;
+
+  case 183:
+#line 758 "xkbparse.y"
+    { (yyval.str)= NULL; }
+    break;
+
+  case 184:
+#line 761 "xkbparse.y"
+    { (yyval.str)= strdup(scanBuf); }
+    break;
+
+
+/* Line 1267 of yacc.c.  */
+#line 2916 "xkbparse.c"
+      default: break;
+    }
+  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+
+  *++yyvsp = yyval;
+
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if ! YYERROR_VERBOSE
+      yyerror (YY_("syntax error"));
+#else
+      {
+       YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
+       if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
+         {
+           YYSIZE_T yyalloc = 2 * yysize;
+           if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
+             yyalloc = YYSTACK_ALLOC_MAXIMUM;
+           if (yymsg != yymsgbuf)
+             YYSTACK_FREE (yymsg);
+           yymsg = (char *) YYSTACK_ALLOC (yyalloc);
+           if (yymsg)
+             yymsg_alloc = yyalloc;
+           else
+             {
+               yymsg = yymsgbuf;
+               yymsg_alloc = sizeof yymsgbuf;
+             }
+         }
+
+       if (0 < yysize && yysize <= yymsg_alloc)
+         {
+           (void) yysyntax_error (yymsg, yystate, yychar);
+           yyerror (yymsg);
+         }
+       else
+         {
+           yyerror (YY_("syntax error"));
+           if (yysize != 0)
+             goto yyexhaustedlab;
+         }
+      }
+#endif
+    }
+
+
+
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse look-ahead token after an
+        error, discard it.  */
+
+      if (yychar <= YYEOF)
+       {
+         /* Return failure if at end of input.  */
+         if (yychar == YYEOF)
+           YYABORT;
+       }
+      else
+       {
+         yydestruct ("Error: discarding",
+                     yytoken, &yylval);
+         yychar = YYEMPTY;
+       }
+    }
+
+  /* Else will try to reuse look-ahead token after shifting the error
+     token.  */
+  goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR.  |
+`---------------------------------------------------*/
+yyerrorlab:
+
+  /* Pacify compilers like GCC when the user code never invokes
+     YYERROR and the label yyerrorlab therefore never appears in user
+     code.  */
+  if (/*CONSTCOND*/ 0)
+     goto yyerrorlab;
+
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYERROR.  */
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+  yystate = *yyssp;
+  goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR.  |
+`-------------------------------------------------------------*/
+yyerrlab1:
+  yyerrstatus = 3;     /* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+       {
+         yyn += YYTERROR;
+         if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+           {
+             yyn = yytable[yyn];
+             if (0 < yyn)
+               break;
+           }
+       }
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+       YYABORT;
+
+
+      yydestruct ("Error: popping",
+                 yystos[yystate], yyvsp);
+      YYPOPSTACK (1);
+      yystate = *yyssp;
+      YY_STACK_PRINT (yyss, yyssp);
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  *++yyvsp = yylval;
+
+
+  /* Shift the error token.  */
+  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+#ifndef yyoverflow
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here.  |
+`-------------------------------------------------*/
+yyexhaustedlab:
+  yyerror (YY_("memory exhausted"));
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+  if (yychar != YYEOF && yychar != YYEMPTY)
+     yydestruct ("Cleanup: discarding lookahead",
+                yytoken, &yylval);
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYABORT or YYACCEPT.  */
+  YYPOPSTACK (yylen);
+  YY_STACK_PRINT (yyss, yyssp);
+  while (yyssp != yyss)
+    {
+      yydestruct ("Cleanup: popping",
+                 yystos[*yyssp], yyvsp);
+      YYPOPSTACK (1);
+    }
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+  if (yymsg != yymsgbuf)
+    YYSTACK_FREE (yymsg);
+#endif
+  /* Make sure YYID is used.  */
+  return YYID (yyresult);
+}
+
+
+#line 763 "xkbparse.y"
+
+void
+yyerror(const char *s)
+{
+    if (warningLevel>0) {
+       (void)fprintf(stderr,"%s: line %d of %s\n",s,lineNum,
+                                       (scanFile?scanFile:"(unknown)"));
+       if ((warningLevel>3))
+           (void)fprintf(stderr,"last scanned symbol is: %s\n",scanBuf);
+    }
+    return;
+}
+
+
+int
+yywrap(void)
+{
+   return 1;
+}
+
+
diff --git a/xkbparse.y b/xkbparse.y
new file mode 100644 (file)
index 0000000..51b3bf7
--- /dev/null
@@ -0,0 +1,782 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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.
+
+ ********************************************************/
+
+%token
+       END_OF_FILE     0
+       ERROR_TOK       255
+       XKB_KEYMAP      1
+       XKB_KEYCODES    2
+       XKB_TYPES       3
+       XKB_SYMBOLS     4
+       XKB_COMPATMAP   5
+       XKB_GEOMETRY    6
+       XKB_SEMANTICS   7
+       XKB_LAYOUT      8
+       INCLUDE         10
+       OVERRIDE        11
+       AUGMENT         12
+       REPLACE         13
+       ALTERNATE       14
+       VIRTUAL_MODS    20
+       TYPE            21
+       INTERPRET       22
+       ACTION_TOK      23
+       KEY             24
+       ALIAS           25
+       GROUP           26
+       MODIFIER_MAP    27
+       INDICATOR       28
+       SHAPE           29
+       KEYS            30
+       ROW             31
+       SECTION         32
+       OVERLAY         33
+       TEXT            34
+       OUTLINE         35
+       SOLID           36
+       LOGO            37
+       VIRTUAL         38
+       EQUALS          40
+       PLUS            41
+       MINUS           42
+       DIVIDE          43
+       TIMES           44
+       OBRACE          45
+       CBRACE          46
+       OPAREN          47
+       CPAREN          48
+       OBRACKET        49
+       CBRACKET        50
+       DOT             51
+       COMMA           52
+       SEMI            53
+       EXCLAM          54
+       INVERT          55
+       STRING          60
+       INTEGER         61
+       FLOAT           62
+       IDENT           63
+       KEYNAME         64
+       PARTIAL         70
+       DEFAULT         71
+       HIDDEN          72
+       ALPHANUMERIC_KEYS       73
+       MODIFIER_KEYS           74
+       KEYPAD_KEYS             75
+       FUNCTION_KEYS           76
+       ALTERNATE_GROUP         77
+%{
+#ifdef DEBUG
+#define        YYDEBUG 1
+#endif
+#define        DEBUG_VAR parseDebug
+#include "parseutils.h"
+#include <X11/keysym.h>
+#include <X11/extensions/XKBgeom.h>
+#include <stdlib.h>
+
+unsigned int parseDebug;
+
+%}
+%right EQUALS
+%left  PLUS MINUS
+%left  TIMES DIVIDE
+%left  EXCLAM INVERT
+%left  OPAREN
+%start XkbFile
+%union {
+       int              ival;
+       unsigned         uval;
+       char            *str;
+       Atom            sval;
+       ParseCommon     *any;
+       ExprDef         *expr;
+       VarDef          *var;
+       VModDef         *vmod;
+       InterpDef       *interp;
+       KeyTypeDef      *keyType;
+       SymbolsDef      *syms;
+       ModMapDef       *modMask;
+       GroupCompatDef  *groupCompat;
+       IndicatorMapDef *ledMap;
+       IndicatorNameDef *ledName;
+       KeycodeDef      *keyName;
+       KeyAliasDef     *keyAlias;
+       ShapeDef        *shape;
+       SectionDef      *section;
+       RowDef          *row;
+       KeyDef          *key;
+       OverlayDef      *overlay;
+       OverlayKeyDef   *olKey;
+       OutlineDef      *outline;
+       DoodadDef       *doodad;
+       XkbFile         *file;
+}
+%type <ival>   Number Integer Float SignedNumber
+%type <uval>   XkbCompositeType FileType MergeMode OptMergeMode
+%type <uval>   DoodadType Flag Flags OptFlags
+%type <str>    KeyName MapName OptMapName KeySym
+%type <sval>   FieldSpec Ident Element String 
+%type <any>    DeclList Decl 
+%type <expr>   OptExprList ExprList Expr Term Lhs Terminal ArrayInit
+%type <expr>   OptKeySymList KeySymList Action ActionList Coord CoordList
+%type <var>    VarDecl VarDeclList SymbolsBody SymbolsVarDecl 
+%type <vmod>   VModDecl VModDefList VModDef
+%type <interp> InterpretDecl InterpretMatch
+%type <keyType>        KeyTypeDecl
+%type <syms>   SymbolsDecl
+%type <modMask>        ModMapDecl
+%type <groupCompat> GroupCompatDecl
+%type <ledMap> IndicatorMapDecl
+%type <ledName>        IndicatorNameDecl
+%type <keyName>        KeyNameDecl
+%type <keyAlias> KeyAliasDecl
+%type <shape>  ShapeDecl
+%type <section>        SectionDecl
+%type <row>    SectionBody SectionBodyItem
+%type <key>    RowBody RowBodyItem Keys Key 
+%type <overlay>        OverlayDecl
+%type <olKey>  OverlayKeyList OverlayKey
+%type <outline>        OutlineList OutlineInList
+%type <doodad> DoodadDecl
+%type <file>   XkbFile XkbMapConfigList XkbMapConfig XkbConfig
+%type <file>   XkbCompositeMap XkbCompMapList
+%%
+XkbFile                :       XkbCompMapList
+                       { $$= rtrnValue= $1; }
+               |       XkbMapConfigList 
+                       { $$= rtrnValue= $1;  }
+               |       XkbConfig
+                       { $$= rtrnValue= $1; }
+               ;
+
+XkbCompMapList :       XkbCompMapList XkbCompositeMap
+                       { $$= (XkbFile *)AppendStmt(&$1->common,&$2->common); }
+               |       XkbCompositeMap
+                       { $$= $1; }
+               ;
+
+XkbCompositeMap        :       OptFlags XkbCompositeType OptMapName OBRACE
+                           XkbMapConfigList
+                       CBRACE SEMI
+                       { $$= CreateXKBFile($2,$3,&$5->common,$1); }
+               ;
+
+XkbCompositeType:      XKB_KEYMAP      { $$= XkmKeymapFile; }
+               |       XKB_SEMANTICS   { $$= XkmSemanticsFile; }
+               |       XKB_LAYOUT      { $$= XkmLayoutFile; }
+               ;
+
+XkbMapConfigList :     XkbMapConfigList XkbMapConfig
+                       { $$= (XkbFile *)AppendStmt(&$1->common,&$2->common); }
+               |       XkbMapConfig
+                       { $$= $1; }
+               ;
+
+XkbMapConfig   :       OptFlags FileType OptMapName OBRACE
+                           DeclList
+                       CBRACE SEMI
+                       { $$= CreateXKBFile($2,$3,$5,$1); }
+               ;
+
+XkbConfig      :       OptFlags FileType OptMapName DeclList
+                       { $$= CreateXKBFile($2,$3,$4,$1); }
+               ;
+
+
+FileType       :       XKB_KEYCODES            { $$= XkmKeyNamesIndex; }
+               |       XKB_TYPES               { $$= XkmTypesIndex; }
+               |       XKB_COMPATMAP           { $$= XkmCompatMapIndex; }
+               |       XKB_SYMBOLS             { $$= XkmSymbolsIndex; }
+               |       XKB_GEOMETRY            { $$= XkmGeometryIndex; }
+               ;
+
+OptFlags       :       Flags                   { $$= $1; }
+               |                               { $$= 0; }
+               ;
+
+Flags          :       Flags Flag              { $$= (($1)|($2)); }
+               |       Flag                    { $$= $1; }
+               ;
+
+Flag           :       PARTIAL                 { $$= XkbLC_Partial; }
+               |       DEFAULT                 { $$= XkbLC_Default; }
+               |       HIDDEN                  { $$= XkbLC_Hidden; }
+               |       ALPHANUMERIC_KEYS       { $$= XkbLC_AlphanumericKeys; }
+               |       MODIFIER_KEYS           { $$= XkbLC_ModifierKeys; }
+               |       KEYPAD_KEYS             { $$= XkbLC_KeypadKeys; }
+               |       FUNCTION_KEYS           { $$= XkbLC_FunctionKeys; }
+               |       ALTERNATE_GROUP         { $$= XkbLC_AlternateGroup; }
+               ;
+
+DeclList       :       DeclList Decl
+                       { $$= AppendStmt($1,$2); }
+               |       { $$= NULL; }
+               ;
+
+Decl           :       OptMergeMode VarDecl
+                       {
+                           $2->merge= StmtSetMerge(&$2->common,$1);
+                           $$= &$2->common;
+                       }
+               |       OptMergeMode VModDecl
+                       {
+                           $2->merge= StmtSetMerge(&$2->common,$1);
+                           $$= &$2->common;
+                       }
+               |       OptMergeMode InterpretDecl
+                       {
+                           $2->merge= StmtSetMerge(&$2->common,$1);
+                           $$= &$2->common;
+                       }
+               |       OptMergeMode KeyNameDecl
+                       {
+                           $2->merge= StmtSetMerge(&$2->common,$1);
+                           $$= &$2->common;
+                       }
+               |       OptMergeMode KeyAliasDecl
+                       {
+                           $2->merge= StmtSetMerge(&$2->common,$1);
+                           $$= &$2->common;
+                       }
+               |       OptMergeMode KeyTypeDecl
+                       {
+                           $2->merge= StmtSetMerge(&$2->common,$1);
+                           $$= &$2->common;
+                       }
+               |       OptMergeMode SymbolsDecl
+                       {
+                           $2->merge= StmtSetMerge(&$2->common,$1);
+                           $$= &$2->common;
+                       }
+               |       OptMergeMode ModMapDecl
+                       {
+                           $2->merge= StmtSetMerge(&$2->common,$1);
+                           $$= &$2->common;
+                       }
+               |       OptMergeMode GroupCompatDecl
+                       {
+                           $2->merge= StmtSetMerge(&$2->common,$1);
+                           $$= &$2->common;
+                       }
+               |       OptMergeMode IndicatorMapDecl
+                       {
+                           $2->merge= StmtSetMerge(&$2->common,$1);
+                           $$= &$2->common;
+                       }
+               |       OptMergeMode IndicatorNameDecl
+                       {
+                           $2->merge= StmtSetMerge(&$2->common,$1);
+                           $$= &$2->common;
+                       }
+               |       OptMergeMode ShapeDecl
+                       {
+                           $2->merge= StmtSetMerge(&$2->common,$1);
+                           $$= &$2->common;
+                       }
+               |       OptMergeMode SectionDecl
+                       {
+                           $2->merge= StmtSetMerge(&$2->common,$1);
+                           $$= &$2->common;
+                       }
+               |       OptMergeMode DoodadDecl
+                       {
+                           $2->merge= StmtSetMerge(&$2->common,$1);
+                           $$= &$2->common;
+                       }
+               |       MergeMode STRING
+                       {
+                           if ($1==MergeAltForm) {
+                               yyerror("cannot use 'alternate' to include other maps");
+                               $$= &IncludeCreate(scanBuf,MergeDefault)->common;
+                           }
+                           else {
+                               $$= &IncludeCreate(scanBuf,$1)->common;
+                           }
+                        }
+               ;
+
+VarDecl                :       Lhs EQUALS Expr SEMI
+                       { $$= VarCreate($1,$3); }
+               |       Ident SEMI
+                       { $$= BoolVarCreate($1,1); }
+               |       EXCLAM Ident SEMI
+                       { $$= BoolVarCreate($2,0); }
+               ;
+
+KeyNameDecl    :       KeyName EQUALS Expr SEMI
+                        {
+                           KeycodeDef *def;
+
+                           def= KeycodeCreate($1,$3);
+                           if ($1)
+                               free($1);
+                           $$= def;
+                       }
+               ;
+
+KeyAliasDecl   :       ALIAS KeyName EQUALS KeyName SEMI
+                       { 
+                           KeyAliasDef *def;
+                           def= KeyAliasCreate($2,$4); 
+                           if ($2)     free($2);       
+                           if ($4)     free($4);       
+                           $$= def;
+                       }
+               ;
+
+VModDecl       :       VIRTUAL_MODS VModDefList SEMI
+                       { $$= $2; }
+               ;
+
+VModDefList    :       VModDefList COMMA VModDef
+                       { $$= (VModDef *)AppendStmt(&$1->common,&$3->common); }
+               |       VModDef
+                       { $$= $1; }
+               ;
+
+VModDef                :       Ident
+                       { $$= VModCreate($1,NULL); }
+               |       Ident EQUALS Expr
+                       { $$= VModCreate($1,$3); }
+               ;
+
+InterpretDecl  :       INTERPRET InterpretMatch OBRACE
+                           VarDeclList
+                       CBRACE SEMI
+                       {
+                           $2->def= $4;
+                           $$= $2;
+                       }
+               ;
+
+InterpretMatch :       KeySym PLUS Expr        
+                       { $$= InterpCreate($1, $3); }
+               |       KeySym                  
+                       { $$= InterpCreate($1, NULL); }
+               ;
+
+VarDeclList    :       VarDeclList VarDecl
+                       { $$= (VarDef *)AppendStmt(&$1->common,&$2->common); }
+               |       VarDecl
+                       { $$= $1; }
+               ;
+
+KeyTypeDecl    :       TYPE String OBRACE
+                           VarDeclList
+                       CBRACE SEMI
+                       { $$= KeyTypeCreate($2,$4); }
+               ;
+
+SymbolsDecl    :       KEY KeyName OBRACE
+                           SymbolsBody
+                       CBRACE SEMI
+                       { $$= SymbolsCreate($2,(ExprDef *)$4); }
+               ;
+
+SymbolsBody    :       SymbolsBody COMMA SymbolsVarDecl
+                       { $$= (VarDef *)AppendStmt(&$1->common,&$3->common); }
+               |       SymbolsVarDecl
+                       { $$= $1; }
+               |       { $$= NULL; }
+               ;
+
+SymbolsVarDecl :       Lhs EQUALS Expr
+                       { $$= VarCreate($1,$3); }
+               |       Lhs EQUALS ArrayInit
+                       { $$= VarCreate($1,$3); }
+               |       Ident
+                       { $$= BoolVarCreate($1,1); }
+               |       EXCLAM Ident
+                       { $$= BoolVarCreate($2,0); }
+               |       ArrayInit
+                       { $$= VarCreate(NULL,$1); }
+               ;
+
+ArrayInit      :       OBRACKET OptKeySymList CBRACKET
+                       { $$= $2; }
+               |       OBRACKET ActionList CBRACKET
+                       { $$= ExprCreateUnary(ExprActionList,TypeAction,$2); }
+               ;
+
+GroupCompatDecl        :       GROUP Integer EQUALS Expr SEMI
+                       { $$= GroupCompatCreate($2,$4); }
+               ;
+
+ModMapDecl     :       MODIFIER_MAP Ident OBRACE ExprList CBRACE SEMI
+                       { $$= ModMapCreate($2,$4); }
+               ;
+
+IndicatorMapDecl:      INDICATOR String OBRACE VarDeclList CBRACE SEMI
+                       { $$= IndicatorMapCreate($2,$4); }
+               ;
+
+IndicatorNameDecl:     INDICATOR Integer EQUALS Expr SEMI
+                       { $$= IndicatorNameCreate($2,$4,False); }
+               |       VIRTUAL INDICATOR Integer EQUALS Expr SEMI
+                       { $$= IndicatorNameCreate($3,$5,True); }
+               ;
+
+ShapeDecl      :       SHAPE String OBRACE OutlineList CBRACE SEMI
+                       { $$= ShapeDeclCreate($2,(OutlineDef *)&$4->common); }
+               |       SHAPE String OBRACE CoordList CBRACE SEMI
+                       { 
+                           OutlineDef *outlines;
+                           outlines= OutlineCreate(None,$4);
+                           $$= ShapeDeclCreate($2,outlines);
+                       }
+               ;
+
+SectionDecl    :       SECTION String OBRACE SectionBody CBRACE SEMI
+                       { $$= SectionDeclCreate($2,$4); }
+               ;
+
+SectionBody    :       SectionBody SectionBodyItem
+                       { $$=(RowDef *)AppendStmt(&$1->common,&$2->common);}
+               |       SectionBodyItem
+                       { $$= $1; }
+               ;
+
+SectionBodyItem        :       ROW OBRACE RowBody CBRACE SEMI
+                       { $$= RowDeclCreate($3); }
+               |       VarDecl
+                       { $$= (RowDef *)$1; }
+               |       DoodadDecl
+                       { $$= (RowDef *)$1; }
+               |       IndicatorMapDecl
+                       { $$= (RowDef *)$1; }
+               |       OverlayDecl
+                       { $$= (RowDef *)$1; }
+               ;
+
+RowBody                :       RowBody RowBodyItem
+                       { $$=(KeyDef *)AppendStmt(&$1->common,&$2->common);}
+               |       RowBodyItem
+                       { $$= $1; }
+               ;
+
+RowBodyItem    :       KEYS OBRACE Keys CBRACE SEMI
+                       { $$= $3; }
+               |       VarDecl
+                       { $$= (KeyDef *)$1; }
+               ;
+
+Keys           :       Keys COMMA Key
+                       { $$=(KeyDef *)AppendStmt(&$1->common,&$3->common);}
+               |       Key
+                       { $$= $1; }
+               ;
+
+Key            :       KeyName
+                       { $$= KeyDeclCreate($1,NULL); }
+               |       OBRACE ExprList CBRACE
+                       { $$= KeyDeclCreate(NULL,$2); }
+               ;
+
+OverlayDecl    :       OVERLAY String OBRACE OverlayKeyList CBRACE SEMI
+                       { $$= OverlayDeclCreate($2,$4); }
+               ;
+
+OverlayKeyList :       OverlayKeyList COMMA OverlayKey
+                       { 
+                           $$= (OverlayKeyDef *)
+                               AppendStmt(&$1->common,&$3->common);
+                       }
+               |       OverlayKey
+                       { $$= $1; }
+               ;
+
+OverlayKey     :       KeyName EQUALS KeyName
+                       { $$= OverlayKeyCreate($1,$3); }
+               ;
+
+OutlineList    :       OutlineList COMMA OutlineInList
+                       { $$=(OutlineDef *)AppendStmt(&$1->common,&$3->common);}
+               |       OutlineInList
+                       { $$= $1; }
+               ;
+
+OutlineInList  :       OBRACE CoordList CBRACE
+                       { $$= OutlineCreate(None,$2); }
+               |       Ident EQUALS OBRACE CoordList CBRACE
+                       { $$= OutlineCreate($1,$4); }
+               |       Ident EQUALS Expr
+                       { $$= OutlineCreate($1,$3); }
+               ;
+
+CoordList      :       CoordList COMMA Coord
+                       { $$= (ExprDef *)AppendStmt(&$1->common,&$3->common); }
+               |       Coord
+                       { $$= $1; }
+               ;
+
+Coord          :       OBRACKET SignedNumber COMMA SignedNumber CBRACKET
+                       {
+                           ExprDef *expr;
+                           expr= ExprCreate(ExprCoord,TypeUnknown);
+                           expr->value.coord.x= $2;
+                           expr->value.coord.y= $4;
+                           $$= expr;
+                       }
+               ;
+
+DoodadDecl     :       DoodadType String OBRACE VarDeclList CBRACE SEMI
+                       { $$= DoodadCreate($1,$2,$4); }
+               ;
+
+DoodadType     :       TEXT                    { $$= XkbTextDoodad; }
+               |       OUTLINE                 { $$= XkbOutlineDoodad; }
+               |       SOLID                   { $$= XkbSolidDoodad; }
+               |       LOGO                    { $$= XkbLogoDoodad; }
+               ;
+
+FieldSpec      :       Ident                   { $$= $1; }
+               |       Element                 { $$= $1; }
+               ;
+
+Element                :       ACTION_TOK              
+                       { $$= XkbInternAtom(NULL,"action",False); }
+               |       INTERPRET
+                       { $$= XkbInternAtom(NULL,"interpret",False); }
+               |       TYPE
+                       { $$= XkbInternAtom(NULL,"type",False); }
+               |       KEY
+                       { $$= XkbInternAtom(NULL,"key",False); }
+               |       GROUP
+                       { $$= XkbInternAtom(NULL,"group",False); }
+               |       MODIFIER_MAP
+                       {$$=XkbInternAtom(NULL,"modifier_map",False);}
+               |       INDICATOR
+                       { $$= XkbInternAtom(NULL,"indicator",False); }
+               |       SHAPE   
+                       { $$= XkbInternAtom(NULL,"shape",False); }
+               |       ROW     
+                       { $$= XkbInternAtom(NULL,"row",False); }
+               |       SECTION 
+                       { $$= XkbInternAtom(NULL,"section",False); }
+               |       TEXT
+                       { $$= XkbInternAtom(NULL,"text",False); }
+               ;
+
+OptMergeMode   :       MergeMode               { $$= $1; }
+               |                               { $$= MergeDefault; }
+               ;
+
+MergeMode      :       INCLUDE                 { $$= MergeDefault; }
+               |       AUGMENT                 { $$= MergeAugment; }
+               |       OVERRIDE                { $$= MergeOverride; }
+               |       REPLACE                 { $$= MergeReplace; }
+               |       ALTERNATE               { $$= MergeAltForm; }
+               ;
+
+OptExprList    :       ExprList                        { $$= $1; }
+               |                               { $$= NULL; }
+               ;
+
+ExprList       :       ExprList COMMA Expr
+                       { $$= (ExprDef *)AppendStmt(&$1->common,&$3->common); }
+               |       Expr
+                       { $$= $1; }
+               ;
+
+Expr           :       Expr DIVIDE Expr
+                       { $$= ExprCreateBinary(OpDivide,$1,$3); }
+               |       Expr PLUS Expr
+                       { $$= ExprCreateBinary(OpAdd,$1,$3); }
+               |       Expr MINUS Expr
+                       { $$= ExprCreateBinary(OpSubtract,$1,$3); }
+               |       Expr TIMES Expr
+                       { $$= ExprCreateBinary(OpMultiply,$1,$3); }
+               |       Lhs EQUALS Expr
+                       { $$= ExprCreateBinary(OpAssign,$1,$3); }
+               |       Term
+                       { $$= $1; }
+               ;
+
+Term           :       MINUS Term
+                       { $$= ExprCreateUnary(OpNegate,$2->type,$2); }
+               |       PLUS Term
+                       { $$= ExprCreateUnary(OpUnaryPlus,$2->type,$2); }
+               |       EXCLAM Term
+                       { $$= ExprCreateUnary(OpNot,TypeBoolean,$2); }
+               |       INVERT Term
+                       { $$= ExprCreateUnary(OpInvert,$2->type,$2); }
+               |       Lhs
+                       { $$= $1;  }
+               |       FieldSpec OPAREN OptExprList CPAREN %prec OPAREN
+                       { $$= ActionCreate($1,$3); }
+               |       Terminal
+                       { $$= $1;  }
+               |       OPAREN Expr CPAREN
+                       { $$= $2;  }
+               ;
+
+ActionList     :       ActionList COMMA Action
+                       { $$= (ExprDef *)AppendStmt(&$1->common,&$3->common); }
+               |       Action
+                       { $$= $1; }
+               ;
+
+Action         :       FieldSpec OPAREN OptExprList CPAREN
+                       { $$= ActionCreate($1,$3); }
+               ;
+
+Lhs            :       FieldSpec
+                       {
+                           ExprDef *expr;
+                            expr= ExprCreate(ExprIdent,TypeUnknown);
+                            expr->value.str= $1;
+                            $$= expr;
+                       }
+               |       FieldSpec DOT FieldSpec
+                        {
+                            ExprDef *expr;
+                            expr= ExprCreate(ExprFieldRef,TypeUnknown);
+                            expr->value.field.element= $1;
+                            expr->value.field.field= $3;
+                            $$= expr;
+                       }
+               |       FieldSpec OBRACKET Expr CBRACKET
+                       {
+                           ExprDef *expr;
+                           expr= ExprCreate(ExprArrayRef,TypeUnknown);
+                           expr->value.array.element= None;
+                           expr->value.array.field= $1;
+                           expr->value.array.entry= $3;
+                           $$= expr;
+                       }
+               |       FieldSpec DOT FieldSpec OBRACKET Expr CBRACKET
+                       {
+                           ExprDef *expr;
+                           expr= ExprCreate(ExprArrayRef,TypeUnknown);
+                           expr->value.array.element= $1;
+                           expr->value.array.field= $3;
+                           expr->value.array.entry= $5;
+                           $$= expr;
+                       }
+               ;
+
+Terminal       :       String
+                       {
+                           ExprDef *expr;
+                            expr= ExprCreate(ExprValue,TypeString);
+                            expr->value.str= $1;
+                            $$= expr;
+                       }
+               |       Integer
+                       {
+                           ExprDef *expr;
+                            expr= ExprCreate(ExprValue,TypeInt);
+                            expr->value.ival= $1;
+                            $$= expr;
+                       }
+               |       Float
+                       {
+                           ExprDef *expr;
+                           expr= ExprCreate(ExprValue,TypeFloat);
+                           expr->value.ival= $1;
+                           $$= expr;
+                       }
+               |       KeyName
+                       {
+                           ExprDef *expr;
+                           expr= ExprCreate(ExprValue,TypeKeyName);
+                           memset(expr->value.keyName,0,5);
+                           strncpy(expr->value.keyName,$1,4);
+                           free($1);
+                           $$= expr;
+                       }
+               ;
+
+OptKeySymList  :       KeySymList                      { $$= $1; }
+               |                                       { $$= NULL; }
+               ;
+
+KeySymList     :       KeySymList COMMA KeySym
+                       { $$= AppendKeysymList($1,$3); }
+               |       KeySym
+                       { $$= CreateKeysymList($1); }
+               ;
+
+KeySym         :       IDENT           { $$= strdup(scanBuf); }
+               |       SECTION         { $$= strdup("section"); }
+               |       Integer         
+                       {
+                           if ($1<10)  { $$= malloc(2); $$[0]= '0' + $1; $$[1]= '\0'; }
+                           else        { $$= malloc(19); snprintf($$, 19, "0x%x", $1); }
+                       }
+               ;
+
+SignedNumber   :       MINUS Number    { $$= -$2; }
+               |       Number              { $$= $1; }
+               ;
+
+Number         :       FLOAT           { $$= scanInt; }
+               |       INTEGER         { $$= scanInt*XkbGeomPtsPerMM; }
+               ;
+
+Float          :       FLOAT           { $$= scanInt; }
+               ;
+
+Integer                :       INTEGER         { $$= scanInt; }
+               ;
+
+KeyName                :       KEYNAME         { $$= strdup(scanBuf); }
+               ;
+
+Ident          :       IDENT   { $$= XkbInternAtom(NULL,scanBuf,False); }
+               |       DEFAULT { $$= XkbInternAtom(NULL,"default",False); }
+               ;
+
+String         :       STRING  { $$= XkbInternAtom(NULL,scanBuf,False); }
+               ;
+
+OptMapName     :       MapName { $$= $1; }
+               |               { $$= NULL; }
+               ;
+
+MapName                :       STRING  { $$= strdup(scanBuf); }
+               ;
+%%
+void
+yyerror(const char *s)
+{
+    if (warningLevel>0) {
+       (void)fprintf(stderr,"%s: line %d of %s\n",s,lineNum,
+                                       (scanFile?scanFile:"(unknown)"));
+       if ((warningLevel>3))
+           (void)fprintf(stderr,"last scanned symbol is: %s\n",scanBuf);
+    }
+    return;
+}
+
+
+int
+yywrap(void)
+{
+   return 1;
+}
+
diff --git a/xkbpath.c b/xkbpath.c
new file mode 100644 (file)
index 0000000..6802012
--- /dev/null
+++ b/xkbpath.c
@@ -0,0 +1,420 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 <X11/Xlib.h>
+#include <X11/XKBlib.h>
+
+#define        DEBUG_VAR debugFlags
+#include "utils.h"
+#include <stdlib.h>
+#include <X11/extensions/XKM.h>
+#include "xkbpath.h"
+
+#ifndef DFLT_XKB_CONFIG_ROOT
+#define DFLT_XKB_CONFIG_ROOT   "/usr/lib/X11/xkb"
+#endif
+
+#ifndef PATH_MAX
+#define        PATH_MAX 1024
+#endif
+
+#define        PATH_CHUNK      8       /* initial szPath */
+
+static Bool noDefaultPath = False;
+static int szPath;         /* number of entries allocated for includePath */
+static int nPathEntries;   /* number of actual entries in includePath */
+static char **includePath; /* Holds all directories we might be including data from */
+
+/**
+ * Extract the first token from an include statement.
+ * @param str_inout Input statement, modified in-place. Can be passed in
+ * repeatedly. If str_inout is NULL, the parsing has completed.
+ * @param file_rtrn Set to the include file to be used.
+ * @param map_rtrn Set to whatever comes after ), if any.
+ * @param nextop_rtrn Set to the next operation in the complete statement.
+ * @param extra_data Set to the string between ( and ), if any.
+ *
+ * @return True if parsing was succcessful, False for an illegal string.
+ *
+ * Example: "evdev+aliases(qwerty)"
+ *      str_inout = aliases(qwerty)
+ *      nextop_retrn = +
+ *      extra_data = NULL
+ *      file_rtrn = evdev
+ *      map_rtrn = NULL
+ *
+ * 2nd run with "aliases(qwerty)"
+ *      str_inout = NULL
+ *      file_rtrn = aliases
+ *      map_rtrn = qwerty
+ *      extra_data = NULL
+ *      nextop_retrn = ""
+ *
+ */
+Bool
+XkbParseIncludeMap(char **str_inout, char **file_rtrn, char **map_rtrn,
+                   char *nextop_rtrn, char **extra_data)
+{
+    char *tmp, *str, *next;
+
+    str = *str_inout;
+    if ((*str == '+') || (*str == '|'))
+    {
+        *file_rtrn = *map_rtrn = NULL;
+        *nextop_rtrn = *str;
+        next = str + 1;
+    }
+    else if (*str == '%')
+    {
+        *file_rtrn = *map_rtrn = NULL;
+        *nextop_rtrn = str[1];
+        next = str + 2;
+    }
+    else
+    {
+        /* search for tokens inside the string */
+        next = strpbrk(str, "|+");
+        if (next)
+        {
+            /* set nextop_rtrn to \0, next to next character */
+            *nextop_rtrn = *next;
+            *next++ = '\0';
+        }
+        else
+        {
+            *nextop_rtrn = '\0';
+            next = NULL;
+        }
+        /* search for :, store result in extra_data */
+        tmp = strchr(str, ':');
+        if (tmp != NULL)
+        {
+            *tmp++ = '\0';
+            *extra_data = uStringDup(tmp);
+        }
+        else
+        {
+            *extra_data = NULL;
+        }
+        tmp = strchr(str, '(');
+        if (tmp == NULL)
+        {
+            *file_rtrn = uStringDup(str);
+            *map_rtrn = NULL;
+        }
+        else if (str[0] == '(')
+        {
+            uFree(*extra_data);
+            return False;
+        }
+        else
+        {
+            *tmp++ = '\0';
+            *file_rtrn = uStringDup(str);
+            str = tmp;
+            tmp = strchr(str, ')');
+            if ((tmp == NULL) || (tmp[1] != '\0'))
+            {
+                uFree(*file_rtrn);
+                uFree(*extra_data);
+                return False;
+            }
+            *tmp++ = '\0';
+            *map_rtrn = uStringDup(str);
+        }
+    }
+    if (*nextop_rtrn == '\0')
+        *str_inout = NULL;
+    else if ((*nextop_rtrn == '|') || (*nextop_rtrn == '+'))
+        *str_inout = next;
+    else
+        return False;
+    return True;
+}
+
+/**
+ * Init memory for include paths.
+ */
+Bool
+XkbInitIncludePath(void)
+{
+    szPath = PATH_CHUNK;
+    includePath = (char **) calloc(szPath, sizeof(char *));
+    if (includePath == NULL)
+        return False;
+    return True;
+}
+
+void
+XkbAddDefaultDirectoriesToPath(void)
+{
+    if (noDefaultPath)
+        return;
+    XkbAddDirectoryToPath(DFLT_XKB_CONFIG_ROOT);
+}
+
+/**
+ * Remove all entries from the global includePath.
+ */
+void
+XkbClearIncludePath(void)
+{
+    register int i;
+
+    if (szPath > 0)
+    {
+        for (i = 0; i < nPathEntries; i++)
+        {
+            if (includePath[i] != NULL)
+            {
+                uFree(includePath[i]);
+                includePath[i] = NULL;
+            }
+        }
+        nPathEntries = 0;
+    }
+    noDefaultPath = True;
+    return;
+}
+
+/**
+ * Add the given path to the global includePath variable.
+ * If dir is NULL, the includePath is emptied.
+ */
+Bool
+XkbAddDirectoryToPath(const char *dir)
+{
+    int len;
+    if ((dir == NULL) || (dir[0] == '\0'))
+    {
+        XkbClearIncludePath();
+        return True;
+    }
+#ifdef __UNIXOS2__
+    dir = (char *) __XOS2RedirRoot(dir);
+#endif
+    len = strlen(dir);
+    if (len + 2 >= PATH_MAX)
+    {                           /* allow for '/' and at least one character */
+        ERROR2("Path entry (%s) too long (maxiumum length is %d)\n",
+               dir, PATH_MAX - 3);
+        return False;
+    }
+    if (nPathEntries >= szPath)
+    {
+        szPath += PATH_CHUNK;
+        includePath = (char **) realloc(includePath, szPath * sizeof(char *));
+        if (includePath == NULL)
+        {
+            WSGO("Allocation failed (includePath)\n");
+            return False;
+        }
+    }
+    includePath[nPathEntries] =
+        (char *) calloc(strlen(dir) + 1, sizeof(char));
+    if (includePath[nPathEntries] == NULL)
+    {
+        WSGO1("Allocation failed (includePath[%d])\n", nPathEntries);
+        return False;
+    }
+    strcpy(includePath[nPathEntries++], dir);
+    return True;
+}
+
+/***====================================================================***/
+
+/**
+ * Return the xkb directory based on the type.
+ * Do not free the memory returned by this function.
+ */
+char *
+XkbDirectoryForInclude(unsigned type)
+{
+    static char buf[32];
+
+    switch (type)
+    {
+    case XkmSemanticsFile:
+        strcpy(buf, "semantics");
+        break;
+    case XkmLayoutFile:
+        strcpy(buf, "layout");
+        break;
+    case XkmKeymapFile:
+        strcpy(buf, "keymap");
+        break;
+    case XkmKeyNamesIndex:
+        strcpy(buf, "keycodes");
+        break;
+    case XkmTypesIndex:
+        strcpy(buf, "types");
+        break;
+    case XkmSymbolsIndex:
+        strcpy(buf, "symbols");
+        break;
+    case XkmCompatMapIndex:
+        strcpy(buf, "compat");
+        break;
+    case XkmGeometryFile:
+    case XkmGeometryIndex:
+        strcpy(buf, "geometry");
+        break;
+    default:
+        strcpy(buf, "");
+        break;
+    }
+    return buf;
+}
+
+/***====================================================================***/
+
+typedef struct _FileCacheEntry
+{
+    char *name;
+    unsigned type;
+    char *path;
+    void *data;
+    struct _FileCacheEntry *next;
+} FileCacheEntry;
+static FileCacheEntry *fileCache;
+
+/**
+ * Add the file with the given name to the internal cache to avoid opening and
+ * parsing the file multiple times. If a cache entry for the same name + type
+ * is already present, the entry is overwritten and the data belonging to the
+ * previous entry is returned.
+ *
+ * @parameter name The name of the file (e.g. evdev).
+ * @parameter type Type of the file (XkbTypesIdx, ... or XkbSemanticsFile, ...)
+ * @parameter path The full path to the file.
+ * @parameter data Already parsed data.
+ *
+ * @return The data from the overwritten file or NULL.
+ */
+void *
+XkbAddFileToCache(char *name, unsigned type, char *path, void *data)
+{
+    FileCacheEntry *entry;
+
+    for (entry = fileCache; entry != NULL; entry = entry->next)
+    {
+        if ((type == entry->type) && (uStringEqual(name, entry->name)))
+        {
+            void *old = entry->data;
+            WSGO2("Replacing file cache entry (%s/%d)\n", name, type);
+            entry->path = path;
+            entry->data = data;
+            return old;
+        }
+    }
+    entry = uTypedAlloc(FileCacheEntry);
+    if (entry != NULL)
+    {
+        entry->name = name;
+        entry->type = type;
+        entry->path = path;
+        entry->data = data;
+        entry->next = fileCache;
+        fileCache = entry;
+    }
+    return NULL;
+}
+
+/**
+ * Search for the given name + type in the cache.
+ *
+ * @parameter name The name of the file (e.g. evdev).
+ * @parameter type Type of the file (XkbTypesIdx, ... or XkbSemanticsFile, ...)
+ * @parameter pathRtrn Set to the full path of the given entry.
+ *
+ * @return the data from the cache entry or NULL if no matching entry was found.
+ */
+void *
+XkbFindFileInCache(char *name, unsigned type, char **pathRtrn)
+{
+    FileCacheEntry *entry;
+
+    for (entry = fileCache; entry != NULL; entry = entry->next)
+    {
+        if ((type == entry->type) && (uStringEqual(name, entry->name)))
+        {
+            *pathRtrn = entry->path;
+            return entry->data;
+        }
+    }
+    return NULL;
+}
+
+/***====================================================================***/
+
+/**
+ * Search for the given file name in the include directories.
+ *
+ * @param type one of XkbTypesIndex, XkbCompatMapIndex, ..., or
+ * XkbSemanticsFile, XkmKeymapFile, ...
+ * @param pathReturn is set to the full path of the file if found.
+ *
+ * @return an FD to the file or NULL. If NULL is returned, the value of
+ * pathRtrn is undefined.
+ */
+FILE *
+XkbFindFileInPath(char *name, unsigned type, char **pathRtrn)
+{
+    register int i;
+    FILE *file = NULL;
+    int nameLen, typeLen, pathLen;
+    char buf[PATH_MAX], *typeDir;
+
+    typeDir = XkbDirectoryForInclude(type);
+    nameLen = strlen(name);
+    typeLen = strlen(typeDir);
+    for (i = 0; i < nPathEntries; i++)
+    {
+        pathLen = strlen(includePath[i]);
+        if (typeLen < 1)
+            continue;
+
+        if ((nameLen + typeLen + pathLen + 2) >= PATH_MAX)
+        {
+            ERROR3("File name (%s/%s/%s) too long\n", includePath[i],
+                   typeDir, name);
+            ACTION("Ignored\n");
+            continue;
+        }
+        snprintf(buf, sizeof(buf), "%s/%s/%s", includePath[i], typeDir, name);
+        file = fopen(buf, "r");
+        if (file != NULL)
+            break;
+    }
+
+    if ((file != NULL) && (pathRtrn != NULL))
+    {
+        *pathRtrn = (char *) calloc(strlen(buf) + 1, sizeof(char));
+        if (*pathRtrn != NULL)
+            strcpy(*pathRtrn, buf);
+    }
+    return file;
+}
diff --git a/xkbpath.h b/xkbpath.h
new file mode 100644 (file)
index 0000000..66c3ab7
--- /dev/null
+++ b/xkbpath.h
@@ -0,0 +1,65 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be
+ used in advertising or publicity pertaining to distribution
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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 _XKBPATH_H_
+#define _XKBPATH_H_ 1
+
+extern Bool XkbInitIncludePath(void);
+
+extern void XkbClearIncludePath(void);
+
+extern void XkbAddDefaultDirectoriesToPath(void);
+
+extern Bool XkbAddDirectoryToPath(const char *  /* dir */
+    );
+
+extern char *XkbDirectoryForInclude(unsigned    /* type */
+    );
+
+extern FILE *XkbFindFileInPath(char * /* name */ ,
+                               unsigned /* type */ ,
+                               char **  /* pathRtrn */
+    );
+
+extern void *XkbAddFileToCache(char * /* name */ ,
+                               unsigned /* type */ ,
+                               char * /* path */ ,
+                               void *   /* data */
+    );
+
+extern void *XkbFindFileInCache(char * /* name */ ,
+                                unsigned /* type */ ,
+                                char ** /* pathRtrn */
+    );
+
+extern Bool XkbParseIncludeMap(char ** /* str_inout */ ,
+                               char ** /* file_rtrn */ ,
+                               char ** /* map_rtrn */ ,
+                               char * /* nextop_rtrn */ ,
+                               char **  /* extra_data */
+    );
+
+#endif /* _XKBPATH_H_ */
diff --git a/xkbscan.c b/xkbscan.c
new file mode 100644 (file)
index 0000000..22a034f
--- /dev/null
+++ b/xkbscan.c
@@ -0,0 +1,748 @@
+/************************************************************
+ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, 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 Silicon Graphics not be 
+ used in advertising or publicity pertaining to distribution 
+ of the software without specific prior written permission.
+ Silicon Graphics makes no representation about the suitability 
+ of this software for any purpose. It is provided "as is"
+ without any express or implied warranty.
+ SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
+ AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ GRAPHICS 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>
+#include <ctype.h>
+#include <X11/Xos.h>
+#include <X11/Xlib.h>
+#include <X11/XKBlib.h>
+
+#include "tokens.h"
+#define        DEBUG_VAR       scanDebug
+#include "utils.h"
+#include "parseutils.h"
+
+unsigned int scanDebug;
+
+FILE *yyin = NULL;
+
+static char scanFileBuf[1024] = {0};
+char *scanFile = scanFileBuf;
+int lineNum = 0;
+
+int scanInt;
+
+char scanBuf[1024];
+static int scanStrLine = 0;
+
+#define        BUFSIZE 4096
+static char readBuf[BUFSIZE];
+static int readBufPos = 0;
+static int readBufLen = 0;
+
+#ifdef DEBUG
+extern int debugFlags;
+
+static char *
+tokText(int tok)
+{
+    static char buf[32];
+
+    switch (tok)
+    {
+    case END_OF_FILE:
+        snprintf(buf, sizeof(buf), "END_OF_FILE");
+        break;
+    case ERROR_TOK:
+        snprintf(buf, sizeof(buf), "ERROR");
+        break;
+
+    case XKB_KEYMAP:
+        snprintf(buf, sizeof(buf), "XKB_KEYMAP");
+        break;
+    case XKB_KEYCODES:
+        snprintf(buf, sizeof(buf), "XKB_KEYCODES");
+        break;
+    case XKB_TYPES:
+        snprintf(buf, sizeof(buf), "XKB_TYPES");
+        break;
+    case XKB_SYMBOLS:
+        snprintf(buf, sizeof(buf), "XKB_SYMBOLS");
+        break;
+    case XKB_COMPATMAP:
+        snprintf(buf, sizeof(buf), "XKB_COMPATMAP");
+        break;
+    case XKB_GEOMETRY:
+        snprintf(buf, sizeof(buf), "XKB_GEOMETRY");
+        break;
+    case XKB_SEMANTICS:
+        snprintf(buf, sizeof(buf), "XKB_SEMANTICS");
+        break;
+    case XKB_LAYOUT:
+        snprintf(buf, sizeof(buf), "XKB_LAYOUT");
+        break;
+
+    case INCLUDE:
+        snprintf(buf, sizeof(buf), "INCLUDE");
+        break;
+    case OVERRIDE:
+        snprintf(buf, sizeof(buf), "OVERRIDE");
+        break;
+    case AUGMENT:
+        snprintf(buf, sizeof(buf), "AUGMENT");
+        break;
+    case REPLACE:
+        snprintf(buf, sizeof(buf), "REPLACE");
+        break;
+    case ALTERNATE:
+        snprintf(buf, sizeof(buf), "ALTERNATE");
+        break;
+
+    case VIRTUAL_MODS:
+        snprintf(buf, sizeof(buf), "VIRTUAL_MODS");
+        break;
+    case TYPE:
+        snprintf(buf, sizeof(buf), "TYPE");
+        break;
+    case INTERPRET:
+        snprintf(buf, sizeof(buf), "INTERPRET");
+        break;
+    case ACTION_TOK:
+        snprintf(buf, sizeof(buf), "ACTION");
+        break;
+    case KEY:
+        snprintf(buf, sizeof(buf), "KEY");
+        break;
+    case ALIAS:
+        snprintf(buf, sizeof(buf), "ALIAS");
+        break;
+    case GROUP:
+        snprintf(buf, sizeof(buf), "GROUP");
+        break;
+    case MODIFIER_MAP:
+        snprintf(buf, sizeof(buf), "MODIFIER_MAP");
+        break;
+    case INDICATOR:
+        snprintf(buf, sizeof(buf), "INDICATOR");
+        break;
+    case SHAPE:
+        snprintf(buf, sizeof(buf), "SHAPE");
+        break;
+    case KEYS:
+        snprintf(buf, sizeof(buf), "KEYS");
+        break;
+    case ROW:
+        snprintf(buf, sizeof(buf), "ROW");
+        break;
+    case SECTION:
+        snprintf(buf, sizeof(buf), "SECTION");
+        break;
+    case OVERLAY:
+        snprintf(buf, sizeof(buf), "OVERLAY");
+        break;
+    case TEXT:
+        snprintf(buf, sizeof(buf), "TEXT");
+        break;
+    case OUTLINE:
+        snprintf(buf, sizeof(buf), "OUTLINE");
+        break;
+    case SOLID:
+        snprintf(buf, sizeof(buf), "SOLID");
+        break;
+    case LOGO:
+        snprintf(buf, sizeof(buf), "LOGO");
+        break;
+    case VIRTUAL:
+        snprintf(buf, sizeof(buf), "VIRTUAL");
+        break;
+
+    case EQUALS:
+        snprintf(buf, sizeof(buf), "EQUALS");
+        break;
+    case PLUS:
+        snprintf(buf, sizeof(buf), "PLUS");
+        break;
+    case MINUS:
+        snprintf(buf, sizeof(buf), "MINUS");
+        break;
+    case DIVIDE:
+        snprintf(buf, sizeof(buf), "DIVIDE");
+        break;
+    case TIMES:
+        snprintf(buf, sizeof(buf), "TIMES");
+        break;
+    case OBRACE:
+        snprintf(buf, sizeof(buf), "OBRACE");
+        break;
+    case CBRACE:
+        snprintf(buf, sizeof(buf), "CBRACE");
+        break;
+    case OPAREN:
+        snprintf(buf, sizeof(buf), "OPAREN");
+        break;
+    case CPAREN:
+        snprintf(buf, sizeof(buf), "CPAREN");
+        break;
+    case OBRACKET:
+        snprintf(buf, sizeof(buf), "OBRACKET");
+        break;
+    case CBRACKET:
+        snprintf(buf, sizeof(buf), "CBRACKET");
+        break;
+    case DOT:
+        snprintf(buf, sizeof(buf), "DOT");
+        break;
+    case COMMA:
+        snprintf(buf, sizeof(buf), "COMMA");
+        break;
+    case SEMI:
+        snprintf(buf, sizeof(buf), "SEMI");
+        break;
+    case EXCLAM:
+        snprintf(buf, sizeof(buf), "EXCLAM");
+        break;
+    case INVERT:
+        snprintf(buf, sizeof(buf), "INVERT");
+        break;
+
+    case STRING:
+        snprintf(buf, sizeof(buf), "STRING (%s)", scanBuf);
+        break;
+    case INTEGER:
+        snprintf(buf, sizeof(buf), "INTEGER (0x%x)", scanInt);
+        break;
+    case FLOAT:
+        snprintf(buf, sizeof(buf), "FLOAT (%d.%d)",
+                scanInt / XkbGeomPtsPerMM, scanInt % XkbGeomPtsPerMM);
+        break;
+    case IDENT:
+        snprintf(buf, sizeof(buf), "IDENT (%s)", scanBuf);
+        break;
+    case KEYNAME:
+        snprintf(buf, sizeof(buf), "KEYNAME (%s)", scanBuf);
+        break;
+
+    case PARTIAL:
+        snprintf(buf, sizeof(buf), "PARTIAL");
+        break;
+    case DEFAULT:
+        snprintf(buf, sizeof(buf), "DEFAULT");
+        break;
+    case HIDDEN:
+        snprintf(buf, sizeof(buf), "HIDDEN");
+        break;
+
+    case ALPHANUMERIC_KEYS:
+        snprintf(buf, sizeof(buf), "ALPHANUMERIC_KEYS");
+        break;
+    case MODIFIER_KEYS:
+        snprintf(buf, sizeof(buf), "MODIFIER_KEYS");
+        break;
+    case KEYPAD_KEYS:
+        snprintf(buf, sizeof(buf), "KEYPAD_KEYS");
+        break;
+    case FUNCTION_KEYS:
+        snprintf(buf, sizeof(buf), "FUNCTION_KEYS");
+        break;
+    case ALTERNATE_GROUP:
+        snprintf(buf, sizeof(buf), "ALTERNATE_GROUP");
+        break;
+
+    default:
+        snprintf(buf, sizeof(buf), "UNKNOWN");
+        break;
+    }
+    return buf;
+}
+#endif
+
+static int
+scanchar(void)
+{
+    if (readBufPos >= readBufLen) {
+        readBufLen = fread(readBuf, 1, BUFSIZE, yyin);
+        readBufPos = 0;
+        if (!readBufLen)
+            return EOF;
+        if (feof(yyin))
+            readBuf[readBufLen] = EOF;
+    }
+
+    return readBuf[readBufPos++];
+}
+
+static void
+unscanchar(int c)
+{
+    if (readBuf[--readBufPos] != c) {
+        fprintf(stderr, "UNGETCHAR FAILED! Put back %c, was expecting %c at "
+                        "position %d, buf is '%s'\n", c, readBuf[readBufPos],
+                        readBufPos, readBuf);
+        _exit(94);
+    }
+}
+
+int
+setScanState(char *file, int line)
+{
+    if (file != NULL)
+        strncpy(scanFile, file, 1024);
+    if (line >= 0)
+        lineNum = line;
+    return 1;
+}
+
+static int
+yyGetString(void)
+{
+    int ch, i;
+
+    i = 0;
+    while (((ch = scanchar()) != EOF) && (ch != '"'))
+    {
+        if (ch == '\\')
+        {
+            if ((ch = scanchar()) != EOF)
+            {
+                if (ch == 'n')
+                    ch = '\n';
+                else if (ch == 't')
+                    ch = '\t';
+                else if (ch == 'v')
+                    ch = '\v';
+                else if (ch == 'b')
+                    ch = '\b';
+                else if (ch == 'r')
+                    ch = '\r';
+                else if (ch == 'f')
+                    ch = '\f';
+                else if (ch == 'e')
+                    ch = '\033';
+                else if (ch == '0')
+                {
+                    int tmp, stop;
+                    ch = stop = 0;
+                    if (((tmp = scanchar()) != EOF) && (isdigit(tmp))
+                        && (tmp != '8') && (tmp != '9'))
+                    {
+                        ch = (ch * 8) + (tmp - '0');
+                    }
+                    else
+                    {
+                        stop = 1;
+                        unscanchar(tmp);
+                    }
+                    if (!stop)
+                    {
+                        if (((tmp = scanchar()) != EOF)
+                            && (isdigit(tmp)) && (tmp != '8') && (tmp != '9'))
+                        {
+                            ch = (ch * 8) + (tmp - '0');
+                        }
+                        else
+                        {
+                            stop = 1;
+                            unscanchar(tmp);
+                        }
+                    }
+                    if (!stop)
+                    {
+                        if (((tmp = scanchar()) != EOF)
+                            && (isdigit(tmp)) && (tmp != '8') && (tmp != '9'))
+                        {
+                            ch = (ch * 8) + (tmp - '0');
+                        }
+                        else
+                        {
+                            stop = 1;
+                            unscanchar(tmp);
+                        }
+                    }
+                }
+            }
+            else
+                return ERROR_TOK;
+        }
+        if (i < sizeof(scanBuf) - 1)
+            scanBuf[i++] = ch;
+    }
+    if (ch == '"')
+    {
+        scanBuf[i++] = '\0';
+        scanStrLine = lineNum;
+        return STRING;
+    }
+    return ERROR_TOK;
+}
+
+static int
+yyGetKeyName(void)
+{
+    int ch, i;
+
+    i = 0;
+    while (((ch = scanchar()) != EOF) && (ch != '>'))
+    {
+        if (ch == '\\')
+        {
+            if ((ch = scanchar()) != EOF)
+            {
+                if (ch == 'n')
+                    ch = '\n';
+                else if (ch == 't')
+                    ch = '\t';
+                else if (ch == 'v')
+                    ch = '\v';
+                else if (ch == 'b')
+                    ch = '\b';
+                else if (ch == 'r')
+                    ch = '\r';
+                else if (ch == 'f')
+                    ch = '\f';
+                else if (ch == 'e')
+                    ch = '\033';
+                else if (ch == '0')
+                {
+                    int tmp, stop;
+                    ch = stop = 0;
+                    if (((tmp = scanchar()) != EOF) && (isdigit(tmp))
+                        && (tmp != '8') && (tmp != '9'))
+                    {
+                        ch = (ch * 8) + (tmp - '0');
+                    }
+                    else
+                    {
+                        stop = 1;
+                        unscanchar(tmp);
+                    }
+                    if ((!stop) && ((tmp = scanchar()) != EOF)
+                        && (isdigit(tmp)) && (tmp != '8') && (tmp != '9'))
+                    {
+                        ch = (ch * 8) + (tmp - '0');
+                    }
+                    else
+                    {
+                        stop = 1;
+                        unscanchar(tmp);
+                    }
+                    if ((!stop) && ((tmp = scanchar()) != EOF)
+                        && (isdigit(tmp)) && (tmp != '8') && (tmp != '9'))
+                    {
+                        ch = (ch * 8) + (tmp - '0');
+                    }
+                    else
+                    {
+                        stop = 1;
+                        unscanchar(tmp);
+                    }
+                }
+            }
+            else
+                return ERROR_TOK;
+        }
+
+        if (i < sizeof(scanBuf) - 1)
+            scanBuf[i++] = ch;
+    }
+    if ((ch == '>') && (i < 5))
+    {
+        scanBuf[i++] = '\0';
+        scanStrLine = lineNum;
+        return KEYNAME;
+    }
+    return ERROR_TOK;
+}
+
+static struct _Keyword
+{
+    const char *keyword;
+    int token;
+} keywords[] =
+{
+    {
+    "xkb_keymap", XKB_KEYMAP},
+    {
+    "xkb_keycodes", XKB_KEYCODES},
+    {
+    "xkb_types", XKB_TYPES},
+    {
+    "xkb_symbols", XKB_SYMBOLS},
+    {
+    "xkb_compat", XKB_COMPATMAP},
+    {
+    "xkb_compat_map", XKB_COMPATMAP},
+    {
+    "xkb_compatibility", XKB_COMPATMAP},
+    {
+    "xkb_compatibility_map", XKB_COMPATMAP},
+    {
+    "xkb_geometry", XKB_GEOMETRY},
+    {
+    "xkb_semantics", XKB_SEMANTICS},
+    {
+    "xkb_layout", XKB_LAYOUT},
+    {
+    "include", INCLUDE},
+    {
+    "override", OVERRIDE},
+    {
+    "augment", AUGMENT},
+    {
+    "replace", REPLACE},
+    {
+    "alternate", ALTERNATE},
+    {
+    "partial", PARTIAL},
+    {
+    "default", DEFAULT},
+    {
+    "hidden", HIDDEN},
+    {
+    "virtual_modifiers", VIRTUAL_MODS},
+    {
+    "type", TYPE},
+    {
+    "interpret", INTERPRET},
+    {
+    "action", ACTION_TOK},
+    {
+    "key", KEY},
+    {
+    "alias", ALIAS},
+    {
+    "group", GROUP},
+    {
+    "modmap", MODIFIER_MAP},
+    {
+    "mod_map", MODIFIER_MAP},
+    {
+    "modifier_map", MODIFIER_MAP},
+    {
+    "indicator", INDICATOR},
+    {
+    "shape", SHAPE},
+    {
+    "row", ROW},
+    {
+    "keys", KEYS},
+    {
+    "section", SECTION},
+    {
+    "overlay", OVERLAY},
+    {
+    "text", TEXT},
+    {
+    "outline", OUTLINE},
+    {
+    "solid", SOLID},
+    {
+    "logo", LOGO},
+    {
+    "virtual", VIRTUAL},
+    {
+    "alphanumeric_keys", ALPHANUMERIC_KEYS},
+    {
+    "modifier_keys", MODIFIER_KEYS},
+    {
+    "keypad_keys", KEYPAD_KEYS},
+    {
+    "function_keys", FUNCTION_KEYS},
+    {
+    "alternate_group", ALTERNATE_GROUP}
+};
+static int numKeywords = sizeof(keywords) / sizeof(struct _Keyword);
+
+static int
+yyGetIdent(int first)
+{
+    int ch, i, j, found;
+    int rtrn = IDENT;
+
+    scanBuf[0] = first;
+    j = 1;
+    while (((ch = scanchar()) != EOF) && (isalnum(ch) || (ch == '_')))
+    {
+        if (j < sizeof(scanBuf) - 1)
+            scanBuf[j++] = ch;
+    }
+    scanBuf[j++] = '\0';
+    found = 0;
+
+    for (i = 0; (!found) && (i < numKeywords); i++)
+    {
+        if (uStrCaseCmp(scanBuf, keywords[i].keyword) == 0)
+        {
+            rtrn = keywords[i].token;
+            found = 1;
+        }
+    }
+    if (!found)
+    {
+        scanStrLine = lineNum;
+        rtrn = IDENT;
+    }
+
+    if ((ch != EOF) && (!isspace(ch)))
+        unscanchar(ch);
+    else if (ch == '\n')
+        lineNum++;
+
+    return rtrn;
+}
+
+static int
+yyGetNumber(int ch)
+{
+    const int nMaxBuffSize = 1024;
+    int isFloat = 0;
+    char buf[nMaxBuffSize];
+    int nInBuf = 0;
+
+    buf[0] = ch;
+    nInBuf = 1;
+    while (((ch = scanchar()) != EOF)
+           && (isxdigit(ch) || ((nInBuf == 1) && (ch == 'x')))
+           && nInBuf < (nMaxBuffSize - 1))
+    {
+        buf[nInBuf++] = ch;
+    }
+    if ((ch == '.') && (nInBuf < (nMaxBuffSize - 1)))
+    {
+        isFloat = 1;
+        buf[nInBuf++] = ch;
+        while (((ch = scanchar()) != EOF) && (isxdigit(ch))
+               && nInBuf < (nMaxBuffSize - 1))
+        {
+            buf[nInBuf++] = ch;
+        }
+    }
+    buf[nInBuf++] = '\0';
+    if ((ch != EOF) && (!isspace(ch)))
+        unscanchar(ch);
+
+    if (isFloat)
+    {
+        float tmp;
+        if (sscanf(buf, "%g", &tmp) == 1)
+        {
+            scanInt = tmp * XkbGeomPtsPerMM;
+            return FLOAT;
+        }
+    }
+    else if (sscanf(buf, "%i", &scanInt) == 1)
+        return INTEGER;
+    fprintf(stderr, "Malformed number %s\n", buf);
+    return ERROR_TOK;
+}
+
+int
+yylex(void)
+{
+    int ch;
+    int rtrn;
+
+    do
+    {
+        ch = scanchar();
+        if (ch == '\n')
+        {
+            lineNum++;
+        }
+        else if (ch == '#')
+        {                       /* handle shell style '#' comments */
+            do
+            {
+                ch = scanchar();
+            }
+            while ((ch != '\n') && (ch != EOF));
+            lineNum++;
+        }
+        else if (ch == '/')
+        {                       /* handle C++ style double-/ comments */
+            int newch = scanchar();
+            if (newch == '/')
+            {
+                do
+                {
+                    ch = scanchar();
+                }
+                while ((ch != '\n') && (ch != EOF));
+                lineNum++;
+            }
+            else if (newch != EOF)
+            {
+                unscanchar(newch);
+            }
+        }
+    }
+    while ((ch != EOF) && (isspace(ch)));
+    if (ch == '=')
+        rtrn = EQUALS;
+    else if (ch == '+')
+        rtrn = PLUS;
+    else if (ch == '-')
+        rtrn = MINUS;
+    else if (ch == '/')
+        rtrn = DIVIDE;
+    else if (ch == '*')
+        rtrn = TIMES;
+    else if (ch == '{')
+        rtrn = OBRACE;
+    else if (ch == '}')
+        rtrn = CBRACE;
+    else if (ch == '(')
+        rtrn = OPAREN;
+    else if (ch == ')')
+        rtrn = CPAREN;
+    else if (ch == '[')
+        rtrn = OBRACKET;
+    else if (ch == ']')
+        rtrn = CBRACKET;
+    else if (ch == '.')
+        rtrn = DOT;
+    else if (ch == ',')
+        rtrn = COMMA;
+    else if (ch == ';')
+        rtrn = SEMI;
+    else if (ch == '!')
+        rtrn = EXCLAM;
+    else if (ch == '~')
+        rtrn = INVERT;
+    else if (ch == '"')
+        rtrn = yyGetString();
+    else if (ch == '<')
+        rtrn = yyGetKeyName();
+    else if (isalpha(ch) || (ch == '_'))
+        rtrn = yyGetIdent(ch);
+    else if (isdigit(ch))
+        rtrn = yyGetNumber(ch);
+    else if (ch == EOF)
+        rtrn = END_OF_FILE;
+    else
+    {
+#ifdef DEBUG
+        if (debugFlags)
+            fprintf(stderr,
+                    "Unexpected character %c (%d) in input stream\n", ch, ch);
+#endif
+        rtrn = ERROR_TOK;
+    }
+#ifdef DEBUG
+    if (debugFlags & 0x2)
+        fprintf(stderr, "scan: %s\n", tokText(rtrn));
+#endif
+    return rtrn;
+}
diff --git a/ylwrap b/ylwrap
new file mode 100755 (executable)
index 0000000..84d5634
--- /dev/null
+++ b/ylwrap
@@ -0,0 +1,222 @@
+#! /bin/sh
+# ylwrap - wrapper for lex/yacc invocations.
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005,
+# 2007, 2009 Free Software Foundation, Inc.
+#
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+case "$1" in
+  '')
+    echo "$0: No files given.  Try \`$0 --help' for more information." 1>&2
+    exit 1
+    ;;
+  --basedir)
+    basedir=$2
+    shift 2
+    ;;
+  -h|--h*)
+    cat <<\EOF
+Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]...
+
+Wrapper for lex/yacc invocations, renaming files as desired.
+
+  INPUT is the input file
+  OUTPUT is one file PROG generates
+  DESIRED is the file we actually want instead of OUTPUT
+  PROGRAM is program to run
+  ARGS are passed to PROG
+
+Any number of OUTPUT,DESIRED pairs may be used.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v|--v*)
+    echo "ylwrap $scriptversion"
+    exit $?
+    ;;
+esac
+
+
+# The input.
+input="$1"
+shift
+case "$input" in
+  [\\/]* | ?:[\\/]*)
+    # Absolute path; do nothing.
+    ;;
+  *)
+    # Relative path.  Make it absolute.
+    input="`pwd`/$input"
+    ;;
+esac
+
+pairlist=
+while test "$#" -ne 0; do
+  if test "$1" = "--"; then
+    shift
+    break
+  fi
+  pairlist="$pairlist $1"
+  shift
+done
+
+# The program to run.
+prog="$1"
+shift
+# Make any relative path in $prog absolute.
+case "$prog" in
+  [\\/]* | ?:[\\/]*) ;;
+  *[\\/]*) prog="`pwd`/$prog" ;;
+esac
+
+# FIXME: add hostname here for parallel makes that run commands on
+# other machines.  But that might take us over the 14-char limit.
+dirname=ylwrap$$
+trap "cd '`pwd`'; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15
+mkdir $dirname || exit 1
+
+cd $dirname
+
+case $# in
+  0) "$prog" "$input" ;;
+  *) "$prog" "$@" "$input" ;;
+esac
+ret=$?
+
+if test $ret -eq 0; then
+  set X $pairlist
+  shift
+  first=yes
+  # Since DOS filename conventions don't allow two dots,
+  # the DOS version of Bison writes out y_tab.c instead of y.tab.c
+  # and y_tab.h instead of y.tab.h. Test to see if this is the case.
+  y_tab_nodot="no"
+  if test -f y_tab.c || test -f y_tab.h; then
+    y_tab_nodot="yes"
+  fi
+
+  # The directory holding the input.
+  input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'`
+  # Quote $INPUT_DIR so we can use it in a regexp.
+  # FIXME: really we should care about more than `.' and `\'.
+  input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'`
+
+  while test "$#" -ne 0; do
+    from="$1"
+    # Handle y_tab.c and y_tab.h output by DOS
+    if test $y_tab_nodot = "yes"; then
+      if test $from = "y.tab.c"; then
+       from="y_tab.c"
+      else
+       if test $from = "y.tab.h"; then
+         from="y_tab.h"
+       fi
+      fi
+    fi
+    if test -f "$from"; then
+      # If $2 is an absolute path name, then just use that,
+      # otherwise prepend `../'.
+      case "$2" in
+       [\\/]* | ?:[\\/]*) target="$2";;
+       *) target="../$2";;
+      esac
+
+      # We do not want to overwrite a header file if it hasn't
+      # changed.  This avoid useless recompilations.  However the
+      # parser itself (the first file) should always be updated,
+      # because it is the destination of the .y.c rule in the
+      # Makefile.  Divert the output of all other files to a temporary
+      # file so we can compare them to existing versions.
+      if test $first = no; then
+       realtarget="$target"
+       target="tmp-`echo $target | sed s/.*[\\/]//g`"
+      fi
+      # Edit out `#line' or `#' directives.
+      #
+      # We don't want the resulting debug information to point at
+      # an absolute srcdir; it is better for it to just mention the
+      # .y file with no path.
+      #
+      # We want to use the real output file name, not yy.lex.c for
+      # instance.
+      #
+      # We want the include guards to be adjusted too.
+      FROM=`echo "$from" | sed \
+            -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
+            -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
+      TARGET=`echo "$2" | sed \
+            -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
+            -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
+
+      sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \
+          -e "s,$FROM,$TARGET," "$from" >"$target" || ret=$?
+
+      # Check whether header files must be updated.
+      if test $first = no; then
+       if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
+         echo "$2" is unchanged
+         rm -f "$target"
+       else
+          echo updating "$2"
+          mv -f "$target" "$realtarget"
+        fi
+      fi
+    else
+      # A missing file is only an error for the first file.  This
+      # is a blatant hack to let us support using "yacc -d".  If -d
+      # is not specified, we don't want an error when the header
+      # file is "missing".
+      if test $first = yes; then
+        ret=1
+      fi
+    fi
+    shift
+    shift
+    first=no
+  done
+else
+  ret=$?
+fi
+
+# Remove the directory.
+cd ..
+rm -rf $dirname
+
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End: