aboutsummaryrefslogtreecommitdiff
path: root/xkbcomp
diff options
context:
space:
mode:
Diffstat (limited to 'xkbcomp')
-rw-r--r--xkbcomp/AUTHORS0
-rw-r--r--xkbcomp/COPYING90
-rw-r--r--xkbcomp/ChangeLog344
-rw-r--r--xkbcomp/INSTALL0
-rw-r--r--xkbcomp/Makefile.am110
-rw-r--r--xkbcomp/Makefile.in740
-rw-r--r--xkbcomp/NEWS0
-rw-r--r--xkbcomp/README25
-rw-r--r--xkbcomp/README.config196
-rw-r--r--xkbcomp/README.enhancing509
-rw-r--r--xkbcomp/aclocal.m41555
-rw-r--r--xkbcomp/action.c1252
-rw-r--r--xkbcomp/action.h91
-rw-r--r--xkbcomp/alias.c261
-rw-r--r--xkbcomp/alias.h61
-rw-r--r--xkbcomp/compat.c780
-rw-r--r--xkbcomp/compat.h8
-rw-r--r--xkbcomp/config.guess1516
-rw-r--r--xkbcomp/config.h.in31
-rw-r--r--xkbcomp/config.sub1626
-rw-r--r--xkbcomp/configure5288
-rw-r--r--xkbcomp/configure.ac42
-rw-r--r--xkbcomp/depcomp589
-rw-r--r--xkbcomp/expr.c976
-rw-r--r--xkbcomp/expr.h189
-rw-r--r--xkbcomp/geometry.c3277
-rw-r--r--xkbcomp/indicators.c485
-rw-r--r--xkbcomp/indicators.h95
-rw-r--r--xkbcomp/install-sh519
-rw-r--r--xkbcomp/keycodes.c749
-rw-r--r--xkbcomp/keycodes.h44
-rw-r--r--xkbcomp/keymap.c168
-rw-r--r--xkbcomp/keytypes.c1159
-rw-r--r--xkbcomp/listing.c462
-rw-r--r--xkbcomp/misc.c502
-rw-r--r--xkbcomp/misc.h126
-rw-r--r--xkbcomp/missing367
-rw-r--r--xkbcomp/parseutils.c748
-rw-r--r--xkbcomp/parseutils.h248
-rw-r--r--xkbcomp/symbols.c1921
-rw-r--r--xkbcomp/tokens.h100
-rw-r--r--xkbcomp/utils.c411
-rw-r--r--xkbcomp/utils.h422
-rw-r--r--xkbcomp/vmod.c225
-rw-r--r--xkbcomp/vmod.h87
-rw-r--r--xkbcomp/xkbcomp.c986
-rw-r--r--xkbcomp/xkbcomp.h380
-rw-r--r--xkbcomp/xkbcomp.man109
-rw-r--r--xkbcomp/xkbparse.c3163
-rw-r--r--xkbcomp/xkbparse.y799
-rw-r--r--xkbcomp/xkbpath.c322
-rw-r--r--xkbcomp/xkbpath.h79
-rw-r--r--xkbcomp/xkbscan.c468
-rw-r--r--xkbcomp/ylwrap223
54 files changed, 34923 insertions, 0 deletions
diff --git a/xkbcomp/AUTHORS b/xkbcomp/AUTHORS
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/xkbcomp/AUTHORS
diff --git a/xkbcomp/COPYING b/xkbcomp/COPYING
new file mode 100644
index 000000000..fc22e80e8
--- /dev/null
+++ b/xkbcomp/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/xkbcomp/ChangeLog b/xkbcomp/ChangeLog
new file mode 100644
index 000000000..6bc06a804
--- /dev/null
+++ b/xkbcomp/ChangeLog
@@ -0,0 +1,344 @@
+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/xkbcomp/INSTALL b/xkbcomp/INSTALL
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/xkbcomp/INSTALL
diff --git a/xkbcomp/Makefile.am b/xkbcomp/Makefile.am
new file mode 100644
index 000000000..ffcbcbde3
--- /dev/null
+++ b/xkbcomp/Makefile.am
@@ -0,0 +1,110 @@
+#
+# 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.
+
+bin_PROGRAMS = xkbcomp
+
+AM_CFLAGS = $(XKBCOMP_CFLAGS) -DDFLT_XKB_CONFIG_ROOT='"$(datadir)/X11/xkb"'
+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
+
+appman_PRE = \
+ xkbcomp.man
+
+BUILT_SOURCES = xkbparse.c
+MAINTAINERCLEANFILES = $(BUILT_SOURCES)
+
+EXTRA_DIST = \
+ README.config \
+ README.enhancing
+
+appmandir = $(APP_MAN_DIR)
+
+appman_DATA = $(appman_PRE:man=@APP_MAN_SUFFIX@)
+
+EXTRA_DIST += $(appman_PRE)
+CLEANFILES = $(appman_DATA)
+
+SED = sed
+
+# Strings to replace in man pages
+XORGRELSTRING = @PACKAGE_STRING@
+ XORGMANNAME = X Version 11
+
+MAN_SUBSTS = \
+ -e 's|__vendorversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \
+ -e 's|__xorgversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \
+ -e 's|__xservername__|Xorg|g' \
+ -e 's|__xconfigfile__|xorg.conf|g' \
+ -e 's|__projectroot__|$(prefix)|g' \
+ -e 's|__apploaddir__|$(appdefaultdir)|' \
+ -e 's|__appmansuffix__|$(APP_MAN_SUFFIX)|g' \
+ -e 's|__libmansuffix__|$(LIB_MAN_SUFFIX)|g' \
+ -e 's|__adminmansuffix__|$(ADMIN_MAN_SUFFIX)|g' \
+ -e 's|__miscmansuffix__|$(MISC_MAN_SUFFIX)|g' \
+ -e 's|__filemansuffix__|$(FILE_MAN_SUFFIX)|g'
+
+SUFFIXES = .$(APP_MAN_SUFFIX) .man
+
+.man.$(APP_MAN_SUFFIX):
+ sed $(MAN_SUBSTS) < $< > $@
+
+EXTRA_DIST += ChangeLog
+MAINTAINERCLEANFILES += ChangeLog
+
+.PHONY: ChangeLog
+
+ChangeLog:
+ (GIT_DIR=$(top_srcdir)/.git git-log > .changelog.tmp && mv .changelog.tmp ChangeLog; rm -f .changelog.tmp) || (touch ChangeLog; echo 'git directory not found: installing possibly empty changelog.' >&2)
+
+dist-hook: ChangeLog
diff --git a/xkbcomp/Makefile.in b/xkbcomp/Makefile.in
new file mode 100644
index 000000000..daf0a98bd
--- /dev/null
+++ b/xkbcomp/Makefile.in
@@ -0,0 +1,740 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008 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@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@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 \
+ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \
+ 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 =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(appmandir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+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
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+@MAINTAINER_MODE_FALSE@am__skipyacc = test -f $@ ||
+YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS)
+YLWRAP = $(top_srcdir)/ylwrap
+SOURCES = $(xkbcomp_SOURCES)
+DIST_SOURCES = $(xkbcomp_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 = `echo $$p | sed -e 's|^.*/||'`;
+appmanDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(appman_DATA)
+ETAGS = etags
+CTAGS = ctags
+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); }; }
+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@
+APP_MAN_DIR = @APP_MAN_DIR@
+APP_MAN_SUFFIX = @APP_MAN_SUFFIX@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+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@
+EXEEXT = @EXEEXT@
+FILE_MAN_DIR = @FILE_MAN_DIR@
+FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@
+INSTALL = @INSTALL@
+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@
+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_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+XKBCOMP_CFLAGS = @XKBCOMP_CFLAGS@
+XKBCOMP_LIBS = @XKBCOMP_LIBS@
+YACC = @YACC@
+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_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AM_CFLAGS = $(XKBCOMP_CFLAGS) -DDFLT_XKB_CONFIG_ROOT='"$(datadir)/X11/xkb"'
+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
+
+appman_PRE = \
+ xkbcomp.man
+
+BUILT_SOURCES = xkbparse.c
+MAINTAINERCLEANFILES = $(BUILT_SOURCES) ChangeLog
+EXTRA_DIST = README.config README.enhancing $(appman_PRE) ChangeLog
+appmandir = $(APP_MAN_DIR)
+appman_DATA = $(appman_PRE:man=@APP_MAN_SUFFIX@)
+CLEANFILES = $(appman_DATA)
+SED = sed
+
+# Strings to replace in man pages
+XORGRELSTRING = @PACKAGE_STRING@
+XORGMANNAME = X Version 11
+MAN_SUBSTS = \
+ -e 's|__vendorversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \
+ -e 's|__xorgversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \
+ -e 's|__xservername__|Xorg|g' \
+ -e 's|__xconfigfile__|xorg.conf|g' \
+ -e 's|__projectroot__|$(prefix)|g' \
+ -e 's|__apploaddir__|$(appdefaultdir)|' \
+ -e 's|__appmansuffix__|$(APP_MAN_SUFFIX)|g' \
+ -e 's|__libmansuffix__|$(LIB_MAN_SUFFIX)|g' \
+ -e 's|__adminmansuffix__|$(ADMIN_MAN_SUFFIX)|g' \
+ -e 's|__miscmansuffix__|$(MISC_MAN_SUFFIX)|g' \
+ -e 's|__filemansuffix__|$(FILE_MAN_SUFFIX)|g'
+
+SUFFIXES = .$(APP_MAN_SUFFIX) .man
+all: $(BUILT_SOURCES) config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .$(APP_MAN_SUFFIX) .man .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) --gnu '; \
+ cd $(srcdir) && $(AUTOMAKE) --gnu \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --gnu 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)
+ cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+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)
+ cd $(top_srcdir) && $(AUTOHEADER)
+ rm -f stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f config.h stamp-h1
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+xkbcomp$(EXEEXT): $(xkbcomp_OBJECTS) $(xkbcomp_DEPENDENCIES)
+ @rm -f xkbcomp$(EXEEXT)
+ $(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@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@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@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@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__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE)
+install-appmanDATA: $(appman_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(appmandir)" || $(MKDIR_P) "$(DESTDIR)$(appmandir)"
+ @list='$(appman_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(appmanDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(appmandir)/$$f'"; \
+ $(appmanDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(appmandir)/$$f"; \
+ done
+
+uninstall-appmanDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(appman_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(appmandir)/$$f'"; \
+ rm -f "$(DESTDIR)$(appmandir)/$$f"; \
+ 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; nonemtpy = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ 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; }; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ 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)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && 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 $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-hook
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -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-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) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.lzma*) \
+ unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(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)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && 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
+ $(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:
+ @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: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(PROGRAMS) $(DATA) config.h
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(appmandir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) 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)
+
+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 "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -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-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-appmanDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -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-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-appmanDATA uninstall-binPROGRAMS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \
+ clean-binPROGRAMS clean-generic ctags dist dist-all dist-bzip2 \
+ dist-gzip dist-hook dist-lzma dist-shar dist-tarZ 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-appmanDATA 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-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+ uninstall-am uninstall-appmanDATA uninstall-binPROGRAMS
+
+
+.man.$(APP_MAN_SUFFIX):
+ sed $(MAN_SUBSTS) < $< > $@
+
+.PHONY: ChangeLog
+
+ChangeLog:
+ (GIT_DIR=$(top_srcdir)/.git git-log > .changelog.tmp && mv .changelog.tmp ChangeLog; rm -f .changelog.tmp) || (touch ChangeLog; echo 'git directory not found: installing possibly empty changelog.' >&2)
+
+dist-hook: ChangeLog
+# 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/xkbcomp/NEWS b/xkbcomp/NEWS
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/xkbcomp/NEWS
diff --git a/xkbcomp/README b/xkbcomp/README
new file mode 100644
index 000000000..8dd7a58c3
--- /dev/null
+++ b/xkbcomp/README
@@ -0,0 +1,25 @@
+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.
+
+The complete specification can be found on
+http://www.x-docs.org/XKB/XKBproto.pdf
+
+For XKB configuration information see 'README.config' file.
+
+For information how to further enhance XKB configuration see 'README.enhancing'
+file.
+
+
+$XFree86$
diff --git a/xkbcomp/README.config b/xkbcomp/README.config
new file mode 100644
index 000000000..4d3f2d5ba
--- /dev/null
+++ b/xkbcomp/README.config
@@ -0,0 +1,196 @@
+ The XKB Configuration Guide
+
+ Kamil Toman, Ivan U. Pascal
+
+ 25 November 2002
+
+ Abstract
+
+ This document describes how to configure X11R6.8 XKB from a user's
+ point a few. It converts basic configuration syntax and gives also
+ a few examples.
+
+1. Overview
+
+The XKB configuration is decomposed into a number of components. Selecting
+proper parts and combining them back you can achieve most of configurations
+you might need. Unless you have a completely atypical keyboard you really
+don't need to touch any of xkb configuration files.
+
+2. Selecting XKB Configuration
+
+The easiest and the most natural way how to specify a keyboard mapping is to
+use rules component. As its name suggests it describes a number of general
+rules how to combine all bits and pieces into a valid and useful keyboard
+mapping. All you need to do is to select a suitable rules file and then to
+feed it with a few parameters that will adjust the keyboard behaviour to ful-
+fill your needs.
+
+The parameters are:
+
+ o XkbRules - files of rules to be used for keyboard mapping composition
+
+ o XkbModel - name of model of your keyboard type
+
+ o XkbLayout - layout(s) you intend to use
+
+ o XkbVariant - variant(s) of layout you intend to use
+
+ o XkbOptions - extra xkb configuration options
+
+The proper rules file depends on your vendor. In reality, the commonest file
+of rules is xorg. For each rules file there is a description file named <ven-
+dor-rules>.lst, for instance xorg.lst which is located in xkb configuration
+subdirectory rules (for example /etc/X11/xkb/rules).
+
+2.1 Basic Configuration
+
+Let's say you want to configure a PC style America keyboard with 104 keys as
+described in xorg.lst. It can be done by simply writing several lines from
+below to you xorg.conf configuration file (previously known as
+/etc/X11/XF86Config-4 or /etc/X11/XF86Config):
+
+ Section "InputDevice"
+ Identifier "Keyboard1"
+ Driver "kbd"
+
+ Option "XkbModel" "pc104"
+ Option "XkbLayout" "us"
+ Option "XKbOptions" ""
+ EndSection
+
+The values of parameters XkbModel and XkbLayout are really not surprising.
+The parameters XkbOptions has been explicitly set to empty set of parameters.
+The parameter XkbVariant has been left out. That means the default variant
+named basic is loaded.
+
+Of course, this can be also done at runtime using utility setxkbmap. Shell
+command loading the same keyboard mapping would look like:
+
+ setxkbmap -rules xorg -model pc104 -layout us -option ""
+
+The configuration and the shell command would be very analogical for most
+other layouts (internationalized mappings).
+
+2.2 Advanced Configuration
+
+You can use multi-layouts xkb configuration. What does it mean? Basically it
+allows to load up to four different keyboard layouts at a time. Each such
+layout would reside in its own group. The groups (unlike complete keyboard
+remapping) can be switched very fast from one to another by a combination of
+keys.
+
+Let's say you want to configure your new Logitech cordless desktop keyboard,
+you intend to use three different layouts at the same time - us, czech and
+german (in this order), and that you are used to Alt-Shift combination for
+switching among them.
+
+Then the configuration snippet could look like this:
+
+ Section "InputDevice"
+ Identifier "Keyboard1"
+ Driver "kbd"
+
+ Option "XkbModel" "logicordless"
+ Option "XkbLayout" "us,cz,de"
+ Option "XKbOptions" "grp:alt_shift_toggle"
+ EndSection
+
+Of course, this can be also done at runtime using utility setxkbmap. Shell
+command loading the same keyboard mapping would look like:
+
+ setxkbmap -rules xorg -model logicordless -layout "us,cz,de" \
+ -option "grp:alt_shift_toggle"
+
+2.3 Even More Advanced Configuration
+
+Okay, let's say you are more demanding. You do like the example above but you
+want it to change a bit. Let's imagine you want the czech keyboard mapping to
+use another variant but basic. The configuration snippet then changes into:
+
+ Section "InputDevice"
+ Identifier "Keyboard1"
+ Driver "kbd"
+
+ Option "XkbModel" "logicordless"
+ Option "XkbLayout" "us,cz,de"
+ Option "XkbVariant" ",bksl,"
+ Option "XKbOptions" "grp:alt_shift_toggle"
+ EndSection
+
+That's seems tricky but it is not. The logic for settings of variants is the
+same as for layouts, that means the first and the third variant settings are
+left out (set to basic), the second is set to bksl (a special variant with an
+enhanced definition of the backslash key).
+
+Analogically, the loading runtime will change to:
+
+ setxkmap -rules xorg -model logicordless -layout "us,cz,de" \
+ -variant ",bksl," -option "grp:alt_shift_toggle"
+
+2.4 Basic Global Options
+
+See rules/*.lst files.
+
+3. Direct XKB Configuration
+
+Generally, you can directly prescribe what configuration of each of basic xkb
+components should be used to form the resulting keyboard mapping. This
+method is rather "brute force". You precisely need to know the structure and
+the meaning of all of used configuration components.
+
+This method also exposes all xkb configuration details directly into
+xorg.conf configuration file which is a not very fortunate fact. In rare
+occasions it may be needed, though. So how does it work?
+
+3.1 Basic Components
+
+There are five basic components used to form a keyboard mapping:
+
+ o key codes - a translation of the scan codes produced by the keyboard
+ into a suitable symbolic form
+
+ o types - a specification of what various combinations of modifiers pro-
+ duce
+
+ o key symbols - a translation of symbolic key codes into actual symbols
+
+ o geometry - a description of physical keyboard geometry
+
+ o compatibility maps - a specification of what action should each key pro-
+ duce in order to preserve compatibility with XKB-unware clients
+
+3.2 Example Configuration
+
+Look at the following example:
+
+ Section "InputDevice"
+ Identifier "Keyboard0"
+ Driver "kbd"
+
+ Option "XkbKeycodes" "xorg"
+ Option "XkbTypes" "default"
+ Option "XkbSymbols" "en_US(pc104)+de+swapcaps"
+ Option "XkbGeometry" "pc(pc104)"
+ Option "XkbCompat" "basic+pc+iso9995"
+ EndSection
+
+This configuration sets the standard X server default interpretation of key-
+board keycodes, sets the default modificator types. The symbol table is com-
+posed of extended US keyboard layout in its variant for pc keyboards with 104
+keys plus all keys for german layout are redefined respectively. Also the
+logical meaning of Caps-lock and Control keys is swapped. The standard key-
+board geometry (physical look) is set to pc style keyboard with 104 keys. The
+compatibility map is set to allow basic shifting, to allow Alt keys to be
+interpreted and also to allow iso9995 group shifting.
+
+4. Keymap XKB Configuration
+
+It is the formerly used way to configure xkb. The user included a special
+keymap file which specified the direct xkb configuration. This method has
+been obsoleted by previously described rules files which are far more flexi-
+ble and allow simpler and more intuitive syntax. It is preserved merely for
+compatibility reasons. Avoid using it if it is possible.
+
+
+$XdotOrg$
diff --git a/xkbcomp/README.enhancing b/xkbcomp/README.enhancing
new file mode 100644
index 000000000..a8456e891
--- /dev/null
+++ b/xkbcomp/README.enhancing
@@ -0,0 +1,509 @@
+ How to further enhance XKB configuration
+
+ Kamil Toman, Ivan U. Pascal
+
+ 25 November 2002
+
+ Abstract
+
+ This guide is aimed to relieve one's labour to create a new (inter-
+ nationalized) keyboard layout. Unlike other documents this guide
+ accents the keymap developer's point of view.
+
+1. Overview
+
+The developer of a new layout should read the xkb protocol specification (The
+X Keyboard Extension: Protocol Specification <URL:http://www.x-
+docs.org/XKB/XKBproto.pdf>) at least to clarify for himself some xkb-specific
+terms used in this document and elsewhere in xkb configuration. Also it shows
+wise to understand how the X server and a client digest their keyboard inputs
+(with and without xkb).
+
+A useful source is also Ivan Pascal's text about xkb configuration
+<URL:http://www.tsu.ru/~pascal/en/xkb> often referenced throughout this docu-
+ment.
+
+Note that this document covers only enhancements which are to be made to
+XFree86 version 4.3 and X11R6.7.0 and above.
+
+2. The Basics
+
+At the startup (or at later at user's command) X server starts its xkb key-
+board module extension and reads data from a compiled configuration file.
+
+This compiled configuration file is prepared by the program xkbcomp which
+behaves altogether as an ordinary compiler (see man xkbcomp). Its input are
+human readable xkb configuration files which are verified and then composed
+into a useful xkb configuration. Users don't need to mess with xkbcomp them-
+selves, for them it is invisible. Usually, it is started upon X server
+startup.
+
+As you probably already know, the xkb configuration consists of five main
+modules:
+
+ Keycodes
+ Tables that defines translation from keyboard scan codes into
+ reasonable symbolic names, maximum, minimum legal keycodes, sym-
+ bolic aliases and description of physically present LED-indica-
+ tors. The primary sence of this component is to allow definitions
+ of maps of symbols (see below) to be independent of physical key-
+ board scancodes. There are two main naming conventions for sym-
+ bolic names (always four bytes long):
+
+ o names which express some traditional meaning like <SPCE>
+ (stands for space bar) or
+
+ o names which express some relative positioning on a key-
+ board, for example <AE01> (an exclamation mark on US key-
+ boards), on the right there are keys <AE02>, <AE03> etc.
+
+ Types
+ Types describe how the produced key is changed by active modi-
+ fiers (like Shift, Control, Alt, ...). There are several prede-
+ fined types which cover most of used combinations.
+
+ Compat
+ Compatibility component defines internal behaviour of modifiers.
+ Using compat component you can assign various actions (elabo-
+ rately described in xkb specification) to key events. This is
+ also the place where LED-indicators behaviour is defined.
+
+ Symbols
+ For i18n purposes, this is the most important table. It defines
+ what values (=symbols) are assigned to what keycodes (represented
+ by their symbolic name, see above). There may be defined more
+ than one value for each key and then it depends on a key type and
+ on modifiers state (respective compat component) which value will
+ be the resulting one.
+
+ Geometry
+ Geometry files aren't used by xkb itself but they may be used by
+ some external programs to depict a keyboard image.
+
+All these components have the files located in xkb configuration tree in sub-
+directories with the same names (usually in /usr/lib/X11/xkb).
+
+3. Enhancing XKB Configuration
+
+Most of xkb enhancements concerns a need to define new output symbols for the
+some input key events. In other words, a need to define a new symbol map (for
+a new language, standard or just to feel more comfortable when typing text).
+
+What do you need to do? Generally, you have to define following things:
+
+ o the map of symbols itself
+
+ o the rules to allow users to select the new mapping
+
+ o the description of the new layout
+
+First of all, it is good to go through existing layouts and to examine them
+if there is something you could easily adjust to fit your needs. Even if
+there is nothing similar you may get some ideas about basic concepts and used
+tricks.
+
+3.1 Levels And Groups
+
+Since XFree86 4.3.0 and X11R6.7.0 you can use multi-layout concept of xkb
+configuration. Though it is still in boundaries of xkb protocol and general
+ideas, the keymap designer must obey new rules when creating new maps. In
+exchange we get a more powerful and cleaner configuration system.
+
+Remember that it is the application which must decide which symbol matches
+which keycode according to effective modifier state. The X server itself
+sends only an input event message to. Of course, usually the general inter-
+pretation is processed by Xlib, Xaw, Motif, Qt, Gtk and similar libraries.
+The X server only supplies its mapping table (usually upon an application
+startup).
+
+You can think of the X server's symbol table as of a irregular table where
+each keycode has its row and where each combination of modifiers determines
+exactly one column. The resulting cell then gives the proper symbolic value.
+Not all keycodes need to bind different values for different combination of
+modifiers. <ENTER> key, for instance, usually doesn't depend on any modi-
+fiers so it its row has only one column defined.
+
+Note that in XKB there is no prior assumption that certain modifiers are
+bound to certain columns. By editing proper files (see refnam (section 4.2,
+page 1)) this mapping can be changed as well.
+
+Unlike the original X protocol the XKB approach is far more flexible. It is
+comfortable to add one additional XKB term - group. You can think of a group
+as of a vector of columns per each keycode (naturally the dimension of this
+vector may differ for different keycodes). What is it good for? The group is
+not very useful unless you intend to use more than one logically different
+set of symbols (like more than one alphabet) defined in a single mapping
+table. But then, the group has a natural meaning - each symbol set has its
+own group and changing it means selecting a different one. XKB approach
+allows up to four different groups. The columns inside each group are called
+(shift) levels. The X server knows the current group and reports it together
+with modifier set and with a keycode in key events.
+
+To sum it up:
+
+ o for each keycode XKB keyboard map contains up to four one-dimensional
+ tables - groups (logically different symbol sets)
+
+ o for each group of a keycode XKB keyboard map contains some columns -
+ shift levels (values reached by combinations of Shift, Ctrl, Alt, ...
+ modifiers)
+
+ o different keycodes can have different number of groups
+
+ o different groups of one keycode can have different number of shift lev-
+ els
+
+ o the current group number is tracked by X server
+
+It is clear that if you sanely define levels, groups and sanely bind modi-
+fiers and associated actions you can have simultaneously loaded up to four
+different symbol sets where each of them would reside in its own group.
+
+The multi-layout concept provides a facility to manipulate xkb groups and
+symbol definitions in a way that allows almost arbitrary composition of pre-
+defined symbol tables. To keep it fully functional you have to:
+
+ o define all symbols only in the first group
+
+ o (re)define any modifiers with extra care to avoid strange (anisometric)
+ behaviour
+
+4. Defining New Layouts
+
+See Some Words About XKB internals <URL:http://www.tsu.ru/~pas-
+cal/en/xkb/internals.html> for explanation of used xkb terms and problems
+addressed by XKB extension.
+
+See Common notes about XKB configuration files language
+<URL:http://www.tsu.ru/~pascal/en/xkb/gram-common.html> for more precise
+explanation of syntax of xkb configuration files.
+
+4.1 Predefined XKB Symbol Sets
+
+If you are about to define some European symbol map extension, you might want
+to use on of four predefined latin alphabet layouts.
+
+Okay, let's assume you want extend an existing keymap and you want to over-
+ride a few keys. Let's take a simple U.K. keyboard as an example (defined in
+pc/gb):
+
+ partial default alphanumeric_keys
+ xkb_symbols "basic" {
+ include "pc/latin"
+
+ name[Group1]="Great Britain";
+
+ key <AE02> { [ 2, quotedbl, twosuperior, oneeighth ] };
+ key <AE03> { [ 3, sterling, threesuperior, sterling ] };
+ key <AC11> { [apostrophe, at, dead_circumflex, dead_caron] };
+ key <TLDE> { [ grave, notsign, bar, bar ] };
+ key <BKSL> { [numbersign, asciitilde, dead_grave, dead_breve ] };
+ key <RALT> { type[Group1]="TWO_LEVEL",
+ [ ISO_Level3_Shift, Multi_key ] };
+
+ modifier_map Mod5 { <RALT> };
+ };
+
+It defines a new layout in basic variant as an extension of common latin
+alphabet layout. The layout (symbol set) name is set to "Great Britain".
+Then there are redefinitions of a few keycodes and a modifiers binding. As
+you can see the number of shift levels is the same for <AE02>, <AE03>,
+<AC11>, <TLDE> and <BKSL> keys but it differs from number of shift levels of
+<RALT>.
+
+Note that the <RALT> key itself is a binding key for Mod5 and that it serves
+like a shift modifier for LevelThree, together with Shift as a multi-key. It
+is a good habit to respect this rule in a new similar layout.
+
+Okay, you could now define more variants of your new layout besides basic
+simply by including (augmenting/overriding/...) the basic definition and
+altering what may be needed.
+
+4.2 Key Types
+
+The differences in the number of columns (shift levels) are caused by a dif-
+ferent types of keys (see the types definition in section basics). Most key-
+codes have implicitly set the keytype in the included 'pc/latin' file to
+'FOUR_LEVEL_ALPHABETIC'. The only exception is <RALT> keycode which is
+explicitly set 'TWO_LEVEL' keytype.
+
+All those names refer to pre-defined shift level schemes. Usually you can
+choose a suitable shift level scheme from default types scheme list in proper
+xkb component's subdirectory.
+
+The most used schemes are:
+
+ ONE_LEVEL
+ The key does not depend on any modifiers. The symbol from first
+ level is always chosen.
+
+ TWO_LEVEL
+ The key uses a modifier Shift and may have two possible values.
+ The second level may be chosen by Shift modifier. If Lock modi-
+ fier (usually Caps-lock) applies the symbol is further processed
+ using system-specific capitalization rules. If both Shift+Lock
+ modifier apply the symbol from the second level is taken and cap-
+ italization rules are applied (and usually have no effect).
+
+ ALPHABETIC
+ The key uses modifiers Shift and Lock. It may have two possible
+ values. The second level may be chosen by Shift modifier. When
+ Lock modifier applies, the symbol from the first level is taken
+ and further processed using system-specific capitalization rules.
+ If both Shift+Lock modifier apply the symbol from the first level
+ is taken and no capitalization rules applied. This is often
+ called shift-cancels-caps behaviour.
+
+ THREE_LEVEL
+ Is the same as TWO_LEVEL but it considers an extra modifier -
+ LevelThree which can be used to gain the symbol value from the
+ third level. If both Shift+LevelThree modifiers apply the value
+ from the third level is also taken. As in TWO_LEVEL, the Lock
+ modifier doesn't influence the resulting level. Only Shift and
+ LevelThree are taken into that consideration. If the Lock modi-
+ fier is active capitalization rules are applied on the resulting
+ symbol.
+
+ FOUR_LEVEL
+ Is the same as THREE_LEVEL but unlike LEVEL_THREE if both
+ Shift+LevelThree modifiers apply the symbol is taken from the
+ fourth level.
+
+ FOUR_LEVEL_ALPHABETIC
+ Is similar to FOUR_LEVEL but also defines shift-cancels-caps
+ behaviour as in ALPHABETIC. If Lock+LevelThree apply the symbol
+ from the third level is taken and the capitalization rules are
+ applied. If Lock+Shift+LevelThree apply the symbol from the
+ third level is taken and no capitalization rules are applied.
+
+ KEYPAD
+ As the name suggest this scheme is primarily used for numeric
+ keypads. The scheme considers two modifiers - Shift and NumLock.
+ If none of modifiers applies the symbol from the first level is
+ taken. If either Shift or NumLock modifiers apply the symbol from
+ the second level is taken. If both Shift+NumLock modifiers apply
+ the symbol from the first level is taken. Again, shift-cancels-
+ caps variant.
+
+ FOUR_LEVEL_KEYPAD
+ Is similar to KEYPAD scheme but considers also LevelThree modi-
+ fier. If LevelThree modifier applies the symbol from the third
+ level is taken. If Shift+LevelThree or NumLock+LevelThree apply
+ the symbol from the fourth level is taken. If all Shift+Num-
+ Lock+LevelThree modifiers apply the symbol from the third level
+ is taken. This also, shift-cancels-caps variant.
+
+Besides that, there are several schemes for special purposes:
+
+ PC_BREAK
+ It is similar to TWO_LEVEL scheme but it considers the Control
+ modifier rather than Shift. That means, the symbol from the sec-
+ ond level is chosen by Control rather than by Shift.
+
+ PC_SYSRQ
+ It is similar to TWO_LEVEL scheme but it considers the Alt modi-
+ fier rather than Shift. That means, the symbol from the second
+ level is chosen by Alt rather than by Shift.
+
+ CTRL+ALT
+ The key uses modifiers Alt and Control. It may have two possible
+ values. If only one modifier (Alt or Control) applies the symbol
+ from the first level is chosen. Only if both Alt+Control modi-
+ fiers apply the symbol from the second level is chosen.
+
+ SHIFT+ALT
+ The key uses modifiers Shift and Alt. It may have two possible
+ values. If only one modifier (Alt or Shift) applies the symbol
+ from the first level is chosen. Only if both Alt+Shift modifiers
+ apply the symbol from the second level is chosen.
+
+If needed, special caps schemes may be used. They redefine the standard
+behaviour of all *ALPHABETIC types. The layouts (maps of symbols) with keys
+defined in respective types then automatically change their behaviour accord-
+ingly. Possible redefinitions are:
+
+ o internal
+
+ o internal_nocancel
+
+ o shift
+
+ o shift_nocancel
+
+None of these schemes should be used directly. They are defined merely for
+'caps:' xkb options (used to globally change the layouts behaviour).
+
+Don't alter any of existing key types. If you need a different behaviour cre-
+ate a new one.
+
+4.2.1 More On Definitions Of Types
+
+When the XKB software deals with a separate type description it gets a com-
+plete list of modifiers that should be taken into account from the 'modi-
+fiers=<list of modifiers>' list and expects that a set of 'map[<combination
+of modifiers>]=<list of modifiers>' instructions that contain the mapping for
+each combination of modifiers mentioned in that list. Modifiers that are not
+explicitly listed are NOT taken into account when the resulting shift level
+is computed. If some combination is omitted the program (subroutine) should
+choose the first level for this combination (a quite reasonable behavior).
+
+Lets consider an example with two modifiers ModOne and ModTwo:
+
+ type "..." {
+ modifiers = ModOne+ModTwo;
+ map[None] = Level1;
+ map[ModOne] = Level2;
+ };
+
+In this case the map statements for ModTwo only and ModOne+ModTwo are omit-
+ted. It means that if the ModTwo is active the subroutine can't found
+explicit mapping for such combination an will use the default level i.e.
+Level1.
+
+But in the case the type described as:
+
+ type "..." {
+ modifiers = ModOne;
+ map[None] = Level1;
+ map[ModOne] = Level2;
+ };
+
+the ModTwo will not be taken into account and the resulting level depends on
+the ModOne state only. That means, ModTwo alone produces the Level1 but the
+combination ModOne+ModTwo produces the Level2 as well as ModOne alone.
+
+What does it mean if the second modifier is the Lock? It means that in the
+first case (the Lock itself is included in the list of modifiers but combina-
+tions with this modifier aren't mentioned in the map statements) the internal
+capitalization rules will be applied to the symbol from the first level. But
+in the second case the capitalization will be applied to the symbol chosen
+accordingly to he first modifier - and this can be the symbol from the first
+as well as from the second level.
+
+Usually, all modifiers introduced in 'modifiers=<list of modifiers>' list are
+used for shift level calculation and then discarded. Sometimes this is not
+desirable. If you want to use a modifier for shift level calculation but you
+don't want to discard it, you may list in 'preserve[<combination of modi-
+fiers>]=<list of modifiers>'. That means, for a given combination all listed
+modifiers will be preserved. If the Lock modifier is preserved then the
+resulting symbol is passed to internal capitalization routine regardless
+whether it has been used for a shift level calculation or not.
+
+Any key type description can use both real and virtual modifiers. Since real
+modifiers always have standard names it is not necessary to explicitly
+declare them. Virtual modifiers can have arbitrary names and can be declared
+(prior using them) directly in key type definition:
+
+ virtual_modifiers <comma-separated list of modifiers> ;
+
+as seen in for example basic, pc or mousekeys key type definitions.
+
+4.3 Rules
+
+Once you are finished with your symbol map you need to add it to rules file.
+The rules file describes how all the five basic keycodes, types, compat, sym-
+bols and geometry components should be composed to give a sensible resulting
+xkb configuration.
+
+The main advantage of rules over formerly used keymaps is a possibility to
+simply parameterize (once) fixed patterns of configurations and thus to ele-
+gantly allow substitutions of various local configurations into predefined
+templates.
+
+A pattern in a rules file (often located in /usr/lib/X11/xkb/rules) can be
+parameterized with four other arguments: Model, Layout, Variant and Options.
+For most cases parameters model and layout should be sufficient for choosing
+a functional keyboard mapping.
+
+The rules file itself is composed of pattern lines and lines with rules. The
+pattern line starts with an exclamation mark ('!') and describes how will the
+xkb interpret the following lines (rules). A sample rules file looks like
+this:
+
+ ! model = keycodes
+ macintosh_old = macintosh
+ ...
+ * = xorg
+
+ ! model = symbols
+ hp = +inet(%m)
+ microsoftpro = +inet(%m)
+ geniuscomfy = +inet(%m)
+
+ ! model layout[1] = symbols
+ macintosh us = macintosh/us%(v[1])
+ * * = pc/pc(%m)+pc/%l[1]%(v[1])
+
+ ! model layout[2] = symbols
+ macintosh us = +macintosh/us[2]%(v[2]):2
+ * * = +pc/%l[2]%(v[2]):2
+
+ ! option = types
+ caps:internal = +caps(internal)
+ caps:internal_nocancel = +caps(internal_nocancel)
+
+Each rule defines what certain combination of values on the left side of
+equal sign ('=') results in. For example a (keyboard) model macintosh_old
+instructs xkb to take definitions of keycodes from file keycodes/macintosh
+while the rest of models (represented by a wild card '*') instructs it to
+take them from file keycodes/xorg. The wild card represents all possible val-
+ues on the left side which were not found in any of the previous rules. The
+more specialized (more complete) rules have higher precedence than general
+ones, i.e. the more general rules supply reasonable default values.
+
+As you can see some lines contain substitution parameters - the parameters
+preceded by the percent sign ('%'). The first alphabetical character after
+the percent sign expands to the value which has been found on the left side.
+For example +%l%(v) expands into +cz(bksl) if the respective values on the
+left side were cz layout in its bksl variant. More, if the layout resp. vari-
+ant parameter is followed by a pair of brackets ('[', ']') it means that xkb
+should place the layout resp. variant into specified xkb group. If the brack-
+ets are omitted the first group is the default value.
+
+So the second block of rules enhances symbol definitions for some particular
+keyboard models with extra keys (for internet, multimedia, ...) . Other mod-
+els are left intact. Similarly, the last block overrides some key type defi-
+nitions, so the common global behaviour ''shift cancels caps'' or ''shift
+doesn't cancel caps'' can be selected. The rest of rules produces special
+symbols for each variant us layout of macintosh keyboard and standard pc sym-
+bols in appropriate variants as a default.
+
+4.4 Descriptive Files of Rules
+
+Now you just need to add a detailed description to <rules>.xml description
+file so the other users (and external programs which often parse this file)
+know what is your work about.
+
+4.4.1 Old Descriptive Files
+
+The formerly used descriptive files were named <rules>.lst Its structure is
+very simple and quite self descriptive but such simplicity had also some cav-
+ities, for example there was no way how to describe local variants of layouts
+and there were problems with the localization of descriptions. To preserve
+compatibility with some older programs, new XML descriptive files can be con-
+verted to old format '.lst'.
+
+For each parameter of rules file should be described its meaning. For the
+rules file described above the .lst file could look like:
+
+ ! model
+ pc104 Generic 104-key PC
+ microsoft Microsoft Natural
+ pc98 PC-98xx Series
+ macintosh Original Macintosh
+ ...
+
+ ! layout
+ us U.S. English
+ cz Czech
+ de German
+ ...
+
+ ! option
+ caps:internal uses internal capitalization. Shift cancels Caps
+ caps:internal_nocancel uses internal capitalization. Shift doesn't cancel Caps
+
+And that should be it. Enjoy creating your own xkb mapping.
+
+
+$XdotOrg$
diff --git a/xkbcomp/aclocal.m4 b/xkbcomp/aclocal.m4
new file mode 100644
index 000000000..c02a45447
--- /dev/null
+++ b/xkbcomp/aclocal.m4
@@ -0,0 +1,1555 @@
+# generated automatically by aclocal 1.10.1 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 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.
+
+# 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(AC_AUTOCONF_VERSION, [2.61],,
+[m4_warning([this file was generated for autoconf 2.61.
+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'.])])
+
+# 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 "$PKG_CONFIG"; then
+ if test -n "$$1"; then
+ pkg_cv_[]$1="$$1"
+ else
+ PKG_CHECK_EXISTS([$3],
+ [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
+ [pkg_failed=yes])
+ fi
+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 --errors-to-stdout --print-errors "$2"`
+ else
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
+ 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
+dnl Copyright 2005-2006 Sun Microsystems, Inc. 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
+dnl "Software"), to deal in the Software without restriction, including
+dnl without limitation the rights to use, copy, modify, merge, publish,
+dnl distribute, and/or sell copies of the Software, and to permit persons
+dnl to whom the Software is furnished to do so, provided that the above
+dnl copyright notice(s) and this permission notice appear in all copies of
+dnl the Software and that both the above copyright notice(s) and this
+dnl permission notice appear in supporting documentation.
+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 OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+dnl HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+dnl INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+dnl FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+dnl NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+dnl WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+dnl
+dnl Except as contained in this notice, the name of a copyright holder
+dnl shall not be used in advertising or otherwise to promote the sale, use
+dnl or other dealings in this Software without prior written authorization
+dnl of the copyright holder.
+
+# 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 force at least a version with this macro defined, also add:
+# m4_ifndef([XORG_MACROS_VERSION], [AC_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.
+AC_DEFUN([XORG_MACROS_VERSION],[
+ [XORG_MACROS_needed_version=$1
+ XORG_MACROS_needed_major=`echo $XORG_MACROS_needed_version | sed 's/\..*$//'`
+ XORG_MACROS_needed_minor=`echo $XORG_MACROS_needed_version | sed -e 's/^[0-9]*\.//' -e 's/\..*$//'`]
+ AC_MSG_CHECKING([if xorg-macros used to generate configure is at least ${XORG_MACROS_needed_major}.${XORG_MACROS_needed_minor}])
+ [XORG_MACROS_version=1.1.5
+ XORG_MACROS_major=`echo $XORG_MACROS_version | sed 's/\..*$//'`
+ XORG_MACROS_minor=`echo $XORG_MACROS_version | sed -e 's/^[0-9]*\.//' -e 's/\..*$//'`]
+ if test $XORG_MACROS_major -ne $XORG_MACROS_needed_major ; then
+ AC_MSG_ERROR([configure built with incompatible version of xorg-macros.m4 - requires version ${XORG_MACROS_major}.x])
+ fi
+ if test $XORG_MACROS_minor -lt $XORG_MACROS_needed_minor ; then
+ AC_MSG_ERROR([configure built with too old of a version of xorg-macros.m4 - requires version ${XORG_MACROS_major}.${XORG_MACROS_minor}.0 or newer])
+ fi
+ AC_MSG_RESULT([yes, $XORG_MACROS_version])
+]) # 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([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])
+ 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([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
+
+AC_DEFUN([XORG_MANPAGE_SECTIONS],[
+AC_REQUIRE([AC_CANONICAL_HOST])
+
+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_MANPAGE_SECTIONS
+
+# 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],[
+XORG_SGML_PATH=$prefix/share/sgml
+HAVE_DEFS_ENT=
+
+if test x"$cross_compiling" = x"yes" ; then
+ HAVE_DEFS_ENT=no
+else
+ AC_CHECK_FILE([$XORG_SGML_PATH/X11/defs.ent], [HAVE_DEFS_ENT=yes])
+fi
+
+AC_PATH_PROG(LINUXDOC, linuxdoc)
+AC_PATH_PROG(PS2PDF, ps2pdf)
+
+AC_MSG_CHECKING([Whether to build documentation])
+
+if test x$HAVE_DEFS_ENT != 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$PS2PDF != x && 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"
+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],[
+XORG_SGML_PATH=$prefix/share/sgml
+HAVE_DEFS_ENT=
+BUILDTXTDOC=no
+BUILDPDFDOC=no
+BUILDPSDOC=no
+BUILDHTMLDOC=no
+
+AC_CHECK_FILE([$XORG_SGML_PATH/X11/defs.ent], [HAVE_DEFS_ENT=yes])
+
+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$HAVE_DEFS_ENT != 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$HAVE_DEFS_ENT != 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$HAVE_DEFS_ENT != 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$HAVE_DEFS_ENT != 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_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,
+ AC_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([
+char *malloc();
+char *realloc();
+char *calloc();
+main() {
+ char *m0, *r0, *c0, *p;
+ m0 = malloc(0);
+ p = malloc(10);
+ r0 = realloc(p,0);
+ c0 = calloc(0);
+ exit(m0 == 0 || r0 == 0 || c0 == 0 ? 0 : 1);
+}],
+ [MALLOC_ZERO_RETURNS_NULL=yes],
+ [MALLOC_ZERO_RETURNS_NULL=no])
+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
+#
+# Sets up flags for source checkers such as lint and sparse if --with-lint
+# is specified. (Use --with-lint=sparse for sparse.)
+# Sets $LINT to name of source checker passed with --with-lint (default: lint)
+# Sets $LINT_FLAGS to flags to pass to source checker
+# Sets LINT automake conditional if enabled (default: disabled)
+#
+AC_DEFUN([XORG_WITH_LINT],[
+
+# Allow checking code with lint, sparse, etc.
+AC_ARG_WITH(lint, [AC_HELP_STRING([--with-lint],
+ [Use a lint-style source code checker (default: disabled)])],
+ [use_lint=$withval], [use_lint=no])
+if test "x$use_lint" = "xyes" ; then
+ LINT="lint"
+else
+ LINT="$use_lint"
+fi
+if test "x$LINT_FLAGS" = "x" -a "x$LINT" != "xno" ; then
+ case $LINT in
+ lint|*/lint)
+ case $host_os in
+ solaris*)
+ LINT_FLAGS="-u -b -h -erroff=E_INDISTING_FROM_TRUNC2"
+ ;;
+ esac
+ ;;
+ esac
+fi
+
+AC_SUBST(LINT)
+AC_SUBST(LINT_FLAGS)
+AM_CONDITIONAL(LINT, [test x$LINT != xno])
+
+]) # 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.
+# Disabled by default, enable with --enable-lint-library
+# Sets:
+# @LINTLIB@ - name of lint library file to make
+# MAKE_LINT_LIB - automake conditional
+#
+
+AC_DEFUN([XORG_LINT_LIBRARY],[
+AC_REQUIRE([XORG_WITH_LINT])
+# Build lint "library" for more indepth checks of programs calling this library
+AC_ARG_ENABLE(lint-library, [AC_HELP_STRING([--enable-lint-library],
+ [Create lint library (default: disabled)])],
+ [make_lint_lib=$enableval], [make_lint_lib=no])
+if test "x$make_lint_lib" != "xno" ; then
+ if test "x$LINT" = "xno" ; then
+ AC_MSG_ERROR([Cannot make lint library without --with-lint])
+ fi
+ if test "x$make_lint_lib" = "xyes" ; then
+ LINTLIB=llib-l$1.ln
+ else
+ LINTLIB=$make_lint_lib
+ fi
+fi
+AC_SUBST(LINTLIB)
+AM_CONDITIONAL(MAKE_LINT_LIB, [test x$make_lint_lib != xno])
+
+]) # XORG_LINT_LIBRARY
+
+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
+# --------------------
+# Adds --with/without-release-string and changes the PACKAGE and
+# PACKAGE_TARNAME to use "$PACKAGE{_TARNAME}-$RELEASE_VERSION". If
+# no option is given, PACKAGE and PACKAGE_TARNAME are unchanged. Also
+# defines PACKAGE_VERSION_{MAJOR,MINOR,PATCHLEVEL} for modules to use.
+
+AC_DEFUN([XORG_RELEASE_VERSION],[
+ AC_ARG_WITH(release-version,
+ AC_HELP_STRING([--with-release-version=STRING],
+ [Use release version string in package name]),
+ [RELEASE_VERSION="$withval"],
+ [RELEASE_VERSION=""])
+ if test "x$RELEASE_VERSION" != "x"; then
+ PACKAGE="$PACKAGE-$RELEASE_VERSION"
+ PACKAGE_TARNAME="$PACKAGE_TARNAME-$RELEASE_VERSION"
+ AC_MSG_NOTICE([Building with package name set to $PACKAGE])
+ fi
+ 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`
+ 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`
+ if test "x$PVP" = "x"; then
+ PVP="0"
+ fi
+ AC_DEFINE_UNQUOTED([PACKAGE_VERSION_PATCHLEVEL],
+ [$PVP],
+ [Patch version of this package])
+])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007 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.10'
+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.10.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 AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.10.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(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
+# 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 8
+
+# 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
+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
+# 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
+
+# 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
+ 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
+
+ case $depmode in
+ 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
+ ;;
+ none) break ;;
+ esac
+ # 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.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} 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 sub/conftest.${OBJEXT-o} 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
+# 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 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; 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"])
+])
+
+# Copyright (C) 1996, 1997, 2000, 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.
+
+# serial 8
+
+# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 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 13
+
+# 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.60])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)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+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
+])
+])
+
+
+# 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 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
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
+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
+# 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
+
+AC_DEFUN([AM_MAINTAINER_MODE],
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode is disabled by default
+ AC_ARG_ENABLE(maintainer-mode,
+[ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer],
+ USE_MAINTAINER_MODE=$enableval,
+ USE_MAINTAINER_MODE=no)
+ 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 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 3
+
+# 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 done
+.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
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+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
+# 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_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
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# 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 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 3
+
+# _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],
+[AC_FOREACH([_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
+# 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_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# 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) 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 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_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_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
+
diff --git a/xkbcomp/action.c b/xkbcomp/action.c
new file mode 100644
index 000000000..8b0ba6507
--- /dev/null
+++ b/xkbcomp/action.c
@@ -0,0 +1,1252 @@
+/* $Xorg: action.c,v 1.3 2000/08/17 19:54:30 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86: xc/programs/xkbcomp/action.c,v 3.10tsi Exp $ */
+
+#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/xkbcomp/action.h b/xkbcomp/action.h
new file mode 100644
index 000000000..4a1166420
--- /dev/null
+++ b/xkbcomp/action.h
@@ -0,0 +1,91 @@
+/* $Xorg: action.h,v 1.3 2000/08/17 19:54:30 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86$ */
+
+#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/xkbcomp/alias.c b/xkbcomp/alias.c
new file mode 100644
index 000000000..f228b0d66
--- /dev/null
+++ b/xkbcomp/alias.c
@@ -0,0 +1,261 @@
+/* $Xorg: alias.c,v 1.3 2000/08/17 19:54:30 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86$ */
+
+#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 old;
+ InitAliasInfo(&old,MergeAugment,0,a->alias,a->real);
+ HandleCollision(&old,info);
+ memcpy(old.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,a-old);
+ }
+#endif
+ if (toGeom)
+ xkb->geom->num_key_aliases+= nNew;
+ ClearCommonInfo(&(*info_in)->def);
+ *info_in= NULL;
+ return True;
+}
diff --git a/xkbcomp/alias.h b/xkbcomp/alias.h
new file mode 100644
index 000000000..fd0338847
--- /dev/null
+++ b/xkbcomp/alias.h
@@ -0,0 +1,61 @@
+/* $Xorg: alias.h,v 1.3 2000/08/17 19:54:30 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86$ */
+
+#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/xkbcomp/compat.c b/xkbcomp/compat.c
new file mode 100644
index 000000000..00eb72b81
--- /dev/null
+++ b/xkbcomp/compat.c
@@ -0,0 +1,780 @@
+/* $Xorg: compat.c,v 1.3 2000/08/17 19:54:30 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86: xc/programs/xkbcomp/compat.c,v 3.3 2001/01/17 23:45:43 dawes Exp $ */
+
+#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"
+
+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;
+ 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) {
+ sprintf(buf,"default");
+ }
+ else {
+ sprintf(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 (merge!=MergeAugment)
+ *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 False;
+ }
+ 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;
+ 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/xkbcomp/compat.h b/xkbcomp/compat.h
new file mode 100644
index 000000000..4edf78879
--- /dev/null
+++ b/xkbcomp/compat.h
@@ -0,0 +1,8 @@
+/* $XFree86$ */
+
+#ifndef COMPAT_H
+#define COMPAT_H 1
+
+extern LookupEntry groupNames[];
+
+#endif /* COMPAT_H */
diff --git a/xkbcomp/config.guess b/xkbcomp/config.guess
new file mode 100644
index 000000000..278f9e9e0
--- /dev/null
+++ b/xkbcomp/config.guess
@@ -0,0 +1,1516 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+# Inc.
+
+timestamp='2007-07-22'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ sh5el) machine=sh5le-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep __ELF__ >/dev/null
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit ;;
+ *:SolidBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit ;;
+ arm:riscos:*:*|arm:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c &&
+ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`$dummy $dummyarg` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+ then
+ echo "$SYSTEM_NAME"
+ else
+ echo rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit ;;
+ *:AIX:*:[45])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ eval $set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep __LP64__ >/dev/null
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit ;;
+ *:FreeBSD:*:*)
+ case ${UNAME_MACHINE} in
+ pc98)
+ echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ amd64)
+ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ *)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ esac
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ *:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ *:Interix*:[3456]*)
+ case ${UNAME_MACHINE} in
+ x86)
+ echo i586-pc-interix${UNAME_RELEASE}
+ exit ;;
+ EM64T | authenticamd)
+ echo x86_64-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 ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-unknown-cygwin
+ exit ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ arm*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ avr32*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit ;;
+ crisv32:Linux:*:*)
+ echo crisv32-axis-linux-gnu
+ exit ;;
+ frv:Linux:*:*)
+ echo frv-unknown-linux-gnu
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ mips:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^CPU/{
+ s: ::g
+ p
+ }'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^CPU/{
+ s: ::g
+ p
+ }'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ or32:Linux:*:*)
+ echo or32-unknown-linux-gnu
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ exit ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ vax:Linux:*:*)
+ echo ${UNAME_MACHINE}-dec-linux-gnu
+ exit ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit ;;
+ xtensa:Linux:*:*)
+ echo xtensa-unknown-linux-gnu
+ exit ;;
+ i*86:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+ | sed -ne '/supported targets:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported targets: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_targets" in
+ elf32-i386)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ ;;
+ a.out-i386-linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit ;;
+ coff-i386)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit ;;
+ "")
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or
+ # one that does not give us useful --help.
+ echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+ exit ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^LIBC/{
+ s: ::g
+ p
+ }'`"
+ test x"${LIBC}" != x && {
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ exit
+ }
+ test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i386.
+ echo i386-pc-msdosdjgpp
+ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo ${UNAME_MACHINE}-stratus-vos
+ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-7:SUPER-UX:*:*)
+ echo sx7-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8:SUPER-UX:*:*)
+ echo sx8-nec-superux${UNAME_RELEASE}
+ exit ;;
+ SX-8R:SUPER-UX:*:*)
+ echo sx8r-nec-superux${UNAME_RELEASE}
+ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit ;;
+ NSE-?:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "${UNAME_MACHINE}" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+ exit ;;
+ i*86:rdos:*:*)
+ echo ${UNAME_MACHINE}-pc-rdos
+ exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ c34*)
+ echo c34-convex-bsd
+ exit ;;
+ c38*)
+ echo c38-convex-bsd
+ exit ;;
+ c4*)
+ echo c4-convex-bsd
+ exit ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/xkbcomp/config.h.in b/xkbcomp/config.h.in
new file mode 100644
index 000000000..1ca40928b
--- /dev/null
+++ b/xkbcomp/config.h.in
@@ -0,0 +1,31 @@
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* 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 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
+
+/* Version number of package */
+#undef VERSION
diff --git a/xkbcomp/config.sub b/xkbcomp/config.sub
new file mode 100644
index 000000000..1761d8bdf
--- /dev/null
+++ b/xkbcomp/config.sub
@@ -0,0 +1,1626 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+# Inc.
+
+timestamp='2007-06-28'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray)
+ os=
+ basic_machine=$1
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco6)
+ os=-sco5v6
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+ | bfin \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fido | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | m32c | m32r | m32rle | m68000 | m68k | m88k \
+ | maxq | mb | microblaze | mcore | mep \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64vr | mips64vrel \
+ | mips64orion | mips64orionel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | mt \
+ | msp430 \
+ | nios | nios2 \
+ | ns16k | ns32k \
+ | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | score \
+ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ | spu | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | z8k)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+ ms1)
+ basic_machine=mt-unknown
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* | avr32-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | m32c-* | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+ | nios-* | nios2-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | xstormy16-* | xtensa-* \
+ | ymp-* \
+ | z8k-*)
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ 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
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ 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
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pc98)
+ basic_machine=i386-pc
+ ;;
+ pc98-*)
+ basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rdos)
+ basic_machine=i386-pc
+ os=-rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sde)
+ basic_machine=mipsisa32-sde
+ os=-elf
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh5el)
+ basic_machine=sh5le-unknown
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+ | -openbsd* | -solidbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ score-*)
+ os=-elf
+ ;;
+ spu-*)
+ os=-elf
+ ;;
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mep-*)
+ os=-elf
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-haiku)
+ os=-haiku
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/xkbcomp/configure b/xkbcomp/configure
new file mode 100644
index 000000000..7ee526ba5
--- /dev/null
+++ b/xkbcomp/configure
@@ -0,0 +1,5288 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.61 for xkbcomp 1.0.5.
+#
+# 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 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=:
+ # Zsh 3.x and 4.x performs 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
+
+
+
+
+# PATH needs CR
+# 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
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+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.)
+as_nl='
+'
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+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
+ echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+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
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+ if (eval ":") 2>/dev/null; then
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+
+ if test $as_have_required = yes && (eval ":
+(as_func_return () {
+ (exit \$1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+ as_lineno_1=\$LINENO
+ as_lineno_2=\$LINENO
+ test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+ test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+ :
+else
+ as_candidate_shells=
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ case $as_dir in
+ /*)
+ for as_base in sh bash ksh sh5; do
+ as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+ done;;
+ esac
+done
+IFS=$as_save_IFS
+
+
+ for as_shell in $as_candidate_shells $SHELL; do
+ # Try only shells that exist, to save several forks.
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs 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
+
+
+:
+_ASEOF
+}; then
+ CONFIG_SHELL=$as_shell
+ as_have_required=yes
+ if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs 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_func_return () {
+ (exit $1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+ break
+fi
+
+fi
+
+ done
+
+ if test "x$CONFIG_SHELL" != x; then
+ for as_var in BASH_ENV ENV
+ do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ done
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+ if test $as_have_required = no; then
+ echo This script requires a shell more modern than all the
+ echo shells that I found on your system. Please install a
+ echo modern shell, or manually run the script under such a
+ echo shell if you do have one.
+ { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+ (exit \$1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+ echo No shell found that supports shell functions.
+ echo Please tell autoconf@gnu.org about your system,
+ echo including any error possibly output before this
+ echo message
+}
+
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line after each line using $LINENO; the second 'sed'
+ # does the real work. The second script uses 'N' to pair each
+ # line-number line with the line containing $LINENO, and appends
+ # trailing '-' during substitution so that $LINENO is not a special
+ # case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # scripts with optimization help from Paolo Bonzini. 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" ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); 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
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+ case `echo 'x\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ *) ECHO_C='\c';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+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
+fi
+echo >conf$$.file
+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
+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=:
+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 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, 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=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME='xkbcomp'
+PACKAGE_TARNAME='xkbcomp'
+PACKAGE_VERSION='1.0.5'
+PACKAGE_STRING='xkbcomp 1.0.5'
+PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=xorg'
+
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+INSTALL_PROGRAM
+INSTALL_SCRIPT
+INSTALL_DATA
+am__isrc
+CYGPATH_W
+PACKAGE
+VERSION
+ACLOCAL
+AUTOCONF
+AUTOMAKE
+AUTOHEADER
+MAKEINFO
+install_sh
+STRIP
+INSTALL_STRIP_PROGRAM
+mkdir_p
+AWK
+SET_MAKE
+am__leading_dot
+AMTAR
+am__tar
+am__untar
+MAINTAINER_MODE_TRUE
+MAINTAINER_MODE_FALSE
+MAINT
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+DEPDIR
+am__include
+am__quote
+AMDEP_TRUE
+AMDEP_FALSE
+AMDEPBACKSLASH
+CCDEPMODE
+am__fastdepCC_TRUE
+am__fastdepCC_FALSE
+YACC
+YFLAGS
+PKG_CONFIG
+XKBCOMP_CFLAGS
+XKBCOMP_LIBS
+build
+build_cpu
+build_vendor
+build_os
+host
+host_cpu
+host_vendor
+host_os
+APP_MAN_SUFFIX
+LIB_MAN_SUFFIX
+FILE_MAN_SUFFIX
+MISC_MAN_SUFFIX
+DRIVER_MAN_SUFFIX
+ADMIN_MAN_SUFFIX
+APP_MAN_DIR
+LIB_MAN_DIR
+FILE_MAN_DIR
+MISC_MAN_DIR
+DRIVER_MAN_DIR
+ADMIN_MAN_DIR
+LIBOBJS
+LTLIBOBJS'
+ac_subst_files=''
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+YACC
+YFLAGS
+PKG_CONFIG
+XKBCOMP_CFLAGS
+XKBCOMP_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# 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=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_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+ eval enable_$ac_feature=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_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+ eval enable_$ac_feature=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+ eval with_$ac_package=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+ eval with_$ac_package=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ 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'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute directory names.
+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
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; }
+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
+ 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 .` ||
+ { echo "$as_me: error: Working directory cannot be determined" >&2
+ { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ { echo "$as_me: error: pwd does not report name of working directory" >&2
+ { (exit 1); exit 1; }; }
+
+
+# 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 -- "$0" ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$0" |
+ 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 .."
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+ { (exit 1); exit 1; }; }
+ 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.0.5 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.0.5:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --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
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-release-version=STRING
+ Use release version string in package name
+
+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 C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ YACC The `Yet Another C 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.
+ PKG_CONFIG path to pkg-config utility
+ 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" || continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`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
+ 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.0.5
+generated by GNU Autoconf 2.61
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 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
+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.0.5, which was
+generated by GNU Autoconf 2.61. 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=.
+ 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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$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
+ ac_configure_args="$ac_configure_args '$ac_arg'"
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ 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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ *) $as_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
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ 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'; { (exit 1); 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
+
+# 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
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+ set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+ set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+ set x "$ac_default_prefix/share/config.site" \
+ "$ac_default_prefix/etc/config.site"
+fi
+shift
+for ac_site_file
+do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ 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.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+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,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+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
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`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.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+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
+
+
+am__api_version='1.10'
+
+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
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
+ { (exit 1); exit 1; }; }
+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.
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+IFS=$as_save_IFS
+
+
+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
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$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'
+
+{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# 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".
+ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}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 $. echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm -f conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+{ echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5
+echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; }
+if test -z "$MKDIR_P"; then
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+
+ 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.
+ test -d ./--version && rmdir ./--version
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ echo "$as_me:$LINENO: result: $MKDIR_P" >&5
+echo "${ECHO_T}$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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+ SET_MAKE=
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+ 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.0.5'
+
+
+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"}
+
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
+
+# 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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&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"
+
+# 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 -'
+
+
+
+
+
+{ echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&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
+
+ { echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5
+echo "${ECHO_T}$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
+
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+
+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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compiler --version >&5") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compiler -v >&5") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compiler -V >&5") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out 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.
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort. b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions. Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; 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 | *.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
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
+
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; 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 | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; 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 ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ 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
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ CFLAGS=""
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+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
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$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
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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"
+ 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+ (eval "$ac_compile") 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then
+ ac_cv_prog_cc_c89=$ac_arg
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+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)
+ { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+ xno)
+ { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+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
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+
+
+{ echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_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
+
+
+
+depcc="$CC" am_compiler_list=
+
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+ 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
+
+ case $depmode in
+ 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
+ ;;
+ none) break ;;
+ esac
+ # 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.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} 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 sub/conftest.${OBJEXT-o} 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
+{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$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
+
+
+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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_YACC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $YACC" >&5
+echo "${ECHO_T}$YACC" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+ test -n "$YACC" && break
+done
+test -n "$YACC" || YACC="yacc"
+
+# 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.
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+IFS=$as_save_IFS
+
+
+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
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$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'
+
+
+# Checks for pkg-config packages
+
+
+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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
+echo "${ECHO_T}$PKG_CONFIG" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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"
+ echo "$as_me:$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
+ { echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5
+echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6; }
+else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+ if test "x$ac_pt_PKG_CONFIG" = x; then
+ PKG_CONFIG=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&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
+ { echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5
+echo $ECHO_N "checking pkg-config is at least version $_pkg_min_version... $ECHO_C" >&6; }
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+ else
+ { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+ PKG_CONFIG=""
+ fi
+
+fi
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for XKBCOMP" >&5
+echo $ECHO_N "checking for XKBCOMP... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$XKBCOMP_CFLAGS"; then
+ pkg_cv_XKBCOMP_CFLAGS="$XKBCOMP_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"x11 xkbfile\"") >&5
+ ($PKG_CONFIG --exists --print-errors "x11 xkbfile") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ pkg_cv_XKBCOMP_CFLAGS=`$PKG_CONFIG --cflags "x11 xkbfile" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+ if test -n "$XKBCOMP_LIBS"; then
+ pkg_cv_XKBCOMP_LIBS="$XKBCOMP_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"x11 xkbfile\"") >&5
+ ($PKG_CONFIG --exists --print-errors "x11 xkbfile") 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ pkg_cv_XKBCOMP_LIBS=`$PKG_CONFIG --libs "x11 xkbfile" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ 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 --errors-to-stdout --print-errors "x11 xkbfile"`
+ else
+ XKBCOMP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "x11 xkbfile"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$XKBCOMP_PKG_ERRORS" >&5
+
+ { { echo "$as_me:$LINENO: error: Package requirements (x11 xkbfile) 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.
+" >&5
+echo "$as_me: error: Package requirements (x11 xkbfile) 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.
+" >&2;}
+ { (exit 1); exit 1; }; }
+elif test $pkg_failed = untried; then
+ { { echo "$as_me:$LINENO: 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." >&5
+echo "$as_me: 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." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ XKBCOMP_CFLAGS=$pkg_cv_XKBCOMP_CFLAGS
+ XKBCOMP_LIBS=$pkg_cv_XKBCOMP_LIBS
+ { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+ :
+fi
+
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+ { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
+echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
+ { (exit 1); exit 1; }; }
+
+{ echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6; }
+if test "${ac_cv_build+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 &&
+ { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+ { (exit 1); exit 1; }; }
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+ { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
+echo "$as_me: error: invalid value of canonical build" >&2;}
+ { (exit 1); exit 1; }; };;
+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
+
+
+{ echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6; }
+if test "${ac_cv_host+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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` ||
+ { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
+echo "$as_me: error: invalid value of canonical host" >&2;}
+ { (exit 1); exit 1; }; };;
+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
+
+
+
+
+
+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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-release-version was given.
+if test "${with_release_version+set}" = set; then
+ withval=$with_release_version; RELEASE_VERSION="$withval"
+else
+ RELEASE_VERSION=""
+fi
+
+ if test "x$RELEASE_VERSION" != "x"; then
+ PACKAGE="$PACKAGE-$RELEASE_VERSION"
+ PACKAGE_TARNAME="$PACKAGE_TARNAME-$RELEASE_VERSION"
+ { echo "$as_me:$LINENO: Building with package name set to $PACKAGE" >&5
+echo "$as_me: Building with package name set to $PACKAGE" >&6;}
+ 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`
+ 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`
+ if test "x$PVP" = "x"; then
+ PVP="0"
+ fi
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION_PATCHLEVEL $PVP
+_ACEOF
+
+
+
+ac_config_files="$ac_config_files Makefile"
+
+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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ *) $as_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
+ test "x$cache_file" != "x/dev/null" &&
+ { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+ cat confcache >$cache_file
+ else
+ { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+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=
+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=`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.
+ ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $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}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## 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=:
+ # Zsh 3.x and 4.x performs 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
+
+
+
+
+# PATH needs CR
+# 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
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+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.)
+as_nl='
+'
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+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
+ echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+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
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line after each line using $LINENO; the second 'sed'
+ # does the real work. The second script uses 'N' to pair each
+ # line-number line with the line containing $LINENO, and appends
+ # trailing '-' during substitution so that $LINENO is not a special
+ # case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # scripts with optimization help from Paolo Bonzini. 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" ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); 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
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+ case `echo 'x\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ *) ECHO_C='\c';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+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
+fi
+echo >conf$$.file
+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
+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=:
+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
+
+# 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.0.5, which was
+generated by GNU Autoconf 2.61. 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
+
+cat >>$CONFIG_STATUS <<_ACEOF
+# 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_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ -q, --quiet 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 <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+xkbcomp config.status 1.0.5
+configured by $0, generated by GNU Autoconf 2.61,
+ with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2006 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'
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+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=$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 )
+ echo "$ac_cs_version"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ { echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ 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.
+ -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$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
+if \$ac_cs_recheck; then
+ echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ CONFIG_SHELL=$SHELL
+ export CONFIG_SHELL
+ exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ 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=
+ trap 'exit_status=$?
+ { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+
+_ACEOF
+
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+am__isrc!$am__isrc$ac_delim
+CYGPATH_W!$CYGPATH_W$ac_delim
+PACKAGE!$PACKAGE$ac_delim
+VERSION!$VERSION$ac_delim
+ACLOCAL!$ACLOCAL$ac_delim
+AUTOCONF!$AUTOCONF$ac_delim
+AUTOMAKE!$AUTOMAKE$ac_delim
+AUTOHEADER!$AUTOHEADER$ac_delim
+MAKEINFO!$MAKEINFO$ac_delim
+install_sh!$install_sh$ac_delim
+STRIP!$STRIP$ac_delim
+INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim
+mkdir_p!$mkdir_p$ac_delim
+AWK!$AWK$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+am__leading_dot!$am__leading_dot$ac_delim
+AMTAR!$AMTAR$ac_delim
+am__tar!$am__tar$ac_delim
+am__untar!$am__untar$ac_delim
+MAINTAINER_MODE_TRUE!$MAINTAINER_MODE_TRUE$ac_delim
+MAINTAINER_MODE_FALSE!$MAINTAINER_MODE_FALSE$ac_delim
+MAINT!$MAINT$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+DEPDIR!$DEPDIR$ac_delim
+am__include!$am__include$ac_delim
+am__quote!$am__quote$ac_delim
+AMDEP_TRUE!$AMDEP_TRUE$ac_delim
+AMDEP_FALSE!$AMDEP_FALSE$ac_delim
+AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim
+CCDEPMODE!$CCDEPMODE$ac_delim
+am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim
+am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim
+YACC!$YACC$ac_delim
+YFLAGS!$YFLAGS$ac_delim
+PKG_CONFIG!$PKG_CONFIG$ac_delim
+XKBCOMP_CFLAGS!$XKBCOMP_CFLAGS$ac_delim
+XKBCOMP_LIBS!$XKBCOMP_LIBS$ac_delim
+build!$build$ac_delim
+build_cpu!$build_cpu$ac_delim
+build_vendor!$build_vendor$ac_delim
+build_os!$build_os$ac_delim
+host!$host$ac_delim
+host_cpu!$host_cpu$ac_delim
+host_vendor!$host_vendor$ac_delim
+host_os!$host_os$ac_delim
+APP_MAN_SUFFIX!$APP_MAN_SUFFIX$ac_delim
+LIB_MAN_SUFFIX!$LIB_MAN_SUFFIX$ac_delim
+FILE_MAN_SUFFIX!$FILE_MAN_SUFFIX$ac_delim
+MISC_MAN_SUFFIX!$MISC_MAN_SUFFIX$ac_delim
+DRIVER_MAN_SUFFIX!$DRIVER_MAN_SUFFIX$ac_delim
+ADMIN_MAN_SUFFIX!$ADMIN_MAN_SUFFIX$ac_delim
+_ACEOF
+
+ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
+ break
+ elif $ac_last_try; then
+ { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+ { (exit 1); exit 1; }; }
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+ ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+ ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+CEOF$ac_eof
+_ACEOF
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ cat >conf$$subs.sed <<_ACEOF
+APP_MAN_DIR!$APP_MAN_DIR$ac_delim
+LIB_MAN_DIR!$LIB_MAN_DIR$ac_delim
+FILE_MAN_DIR!$FILE_MAN_DIR$ac_delim
+MISC_MAN_DIR!$MISC_MAN_DIR$ac_delim
+DRIVER_MAN_DIR!$DRIVER_MAN_DIR$ac_delim
+ADMIN_MAN_DIR!$ADMIN_MAN_DIR$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 8; then
+ break
+ elif $ac_last_try; then
+ { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+ { (exit 1); exit 1; }; }
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+ ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+ ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ 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[ ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[ ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
+
+
+for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+ { (exit 1); exit 1; }; };;
+ :[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="$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 ||
+ { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+ ac_file_inputs="$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 "`IFS=:
+ echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ fi
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$tmp/stdin";;
+ 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 ||
+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"
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`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 ||
+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" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+ { (exit 1); exit 1; }; }; }
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`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
+# 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=
+
+case `sed -n '/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ 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
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;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
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+ { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined." >&5
+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 "$tmp/stdin"
+ case $ac_file in
+ -) cat "$tmp/out"; rm -f "$tmp/out";;
+ *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+ esac
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+_ACEOF
+
+# Transform confdefs.h into a sed script `conftest.defines', that
+# substitutes the proper values into config.h.in to produce config.h.
+rm -f conftest.defines conftest.tail
+# First, append a space to every undef/define line, to ease matching.
+echo 's/$/ /' >conftest.defines
+# Then, protect against being on the right side of a sed subst, or in
+# an unquoted here document, in config.status. If some macros were
+# called several times there might be several #defines for the same
+# symbol, which is useless. But do not sort them, since the last
+# AC_DEFINE must be honored.
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
+# NAME is the cpp macro being defined, VALUE is the value it is being given.
+# PARAMS is the parameter list in the macro definition--in most cases, it's
+# just an empty string.
+ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*'
+ac_dB='\\)[ (].*,\\1define\\2'
+ac_dC=' '
+ac_dD=' ,'
+
+uniq confdefs.h |
+ sed -n '
+ t rset
+ :rset
+ s/^[ ]*#[ ]*define[ ][ ]*//
+ t ok
+ d
+ :ok
+ s/[\\&,]/\\&/g
+ s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
+ s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
+ ' >>conftest.defines
+
+# Remove the space that was appended to ease matching.
+# Then 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.
+# (The regexp can be short, since the line contains either #define or #undef.)
+echo 's/ $//
+s,^[ #]*u.*,/* & */,' >>conftest.defines
+
+# Break up conftest.defines:
+ac_max_sed_lines=50
+
+# First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1"
+# Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2"
+# Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1"
+# et cetera.
+ac_in='$ac_file_inputs'
+ac_out='"$tmp/out1"'
+ac_nxt='"$tmp/out2"'
+
+while :
+do
+ # Write a here document:
+ cat >>$CONFIG_STATUS <<_ACEOF
+ # First, check the format of the line:
+ cat >"\$tmp/defines.sed" <<\\CEOF
+/^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def
+/^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def
+b
+:def
+_ACEOF
+ sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
+ ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
+ sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
+ grep . conftest.tail >/dev/null || break
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines conftest.tail
+
+echo "ac_result=$ac_in" >>$CONFIG_STATUS
+cat >>$CONFIG_STATUS <<\_ACEOF
+ if test x"$ac_file" != x-; then
+ echo "/* $configure_input */" >"$tmp/config.h"
+ cat "$ac_result" >>"$tmp/config.h"
+ if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f $ac_file
+ mv "$tmp/config.h" $ac_file
+ fi
+ else
+ echo "/* $configure_input */"
+ cat "$ac_result"
+ fi
+ rm -f "$tmp/out12"
+# 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 ||
+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) { echo "$as_me:$LINENO: executing $ac_file commands" >&5
+echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; 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 ||
+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 ||
+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
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`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 ||
+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" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+ { (exit 1); exit 1; }; }; }
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+ ;;
+
+ esac
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# 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 || { (exit 1); exit 1; }
+fi
+
diff --git a/xkbcomp/configure.ac b/xkbcomp/configure.ac
new file mode 100644
index 000000000..2f3468fbb
--- /dev/null
+++ b/xkbcomp/configure.ac
@@ -0,0 +1,42 @@
+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.57])
+AC_INIT(xkbcomp,[1.0.5], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],xkbcomp)
+AM_INIT_AUTOMAKE([dist-bzip2])
+AM_MAINTAINER_MODE
+
+AM_CONFIG_HEADER(config.h)
+
+AC_PROG_CC
+AC_PROG_YACC
+AC_PROG_INSTALL
+
+# Checks for pkg-config packages
+PKG_CHECK_MODULES(XKBCOMP, x11 xkbfile)
+AC_SUBST(XKBCOMP_CFLAGS)
+AC_SUBST(XKBCOMP_LIBS)
+
+XORG_MANPAGE_SECTIONS
+XORG_RELEASE_VERSION
+
+AC_OUTPUT([Makefile])
diff --git a/xkbcomp/depcomp b/xkbcomp/depcomp
new file mode 100644
index 000000000..e5f9736c7
--- /dev/null
+++ b/xkbcomp/depcomp
@@ -0,0 +1,589 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2007-03-29.01
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 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 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
+
+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 $1 != '--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 $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no
+ for arg in "$@"; do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ 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.
+ -*|$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 $1 != '--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, regardless of -o,
+ # because we must use -o when running libtool.
+ "$@" || exit $?
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ echo " " >> "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+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-end: "$"
+# End:
diff --git a/xkbcomp/expr.c b/xkbcomp/expr.c
new file mode 100644
index 000000000..6e01d7daf
--- /dev/null
+++ b/xkbcomp/expr.c
@@ -0,0 +1,976 @@
+/* $XdotOrg: expr.c,v 1.5 2000/08/17 19:54:30 cpqbld Exp $ */
+/* $Xorg: expr.c,v 1.5 2000/08/17 19:54:30 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86: xc/programs/xkbcomp/expr.c,v 3.7 2003/08/06 14:04:05 eich Exp $ */
+
+#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:
+ sprintf(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:
+ sprintf(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!=None)&&(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!=None)
+ 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/xkbcomp/expr.h b/xkbcomp/expr.h
new file mode 100644
index 000000000..065716da8
--- /dev/null
+++ b/xkbcomp/expr.h
@@ -0,0 +1,189 @@
+/* $Xorg: expr.h,v 1.3 2000/08/17 19:54:30 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86$ */
+
+#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/xkbcomp/geometry.c b/xkbcomp/geometry.c
new file mode 100644
index 000000000..8e47d7e43
--- /dev/null
+++ b/xkbcomp/geometry.c
@@ -0,0 +1,3277 @@
+/* $Xorg: geometry.c,v 1.3 2000/08/17 19:54:30 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86: xc/programs/xkbcomp/geometry.c,v 1.5tsi Exp $ */
+
+#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 oiText(d,o) ((o)?XkbAtomText((d),(o)->name,XkbMessage):"default")
+
+
+#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(RowInfo *));
+ 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",
+ oiText(info->dpy,&ol),
+ 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 *si;
+ si= FindShape(info,ki->shape,"key",keyText(ki));
+ if (!si)
+ return False;
+ key->shape_ndx= si->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/xkbcomp/indicators.c b/xkbcomp/indicators.c
new file mode 100644
index 000000000..3061f3e27
--- /dev/null
+++ b/xkbcomp/indicators.c
@@ -0,0 +1,485 @@
+/* $Xorg: indicators.c,v 1.3 2000/08/17 19:54:31 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86: xc/programs/xkbcomp/indicators.c,v 1.4 2001/01/17 23:45:43 dawes Exp $ */
+
+#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 False;
+ }
+ *old= *new;
+ old->defs.next= NULL;
+ if (last) {
+ last->defs.next= &old->defs;
+ return oldLEDs;
+ }
+ return old;
+}
+
+LookupEntry modComponentNames[] = {
+ { "base", XkbIM_UseBase },
+ { "latched", XkbIM_UseLatched },
+ { "locked", XkbIM_UseLocked },
+ { "effective", XkbIM_UseEffective },
+ { "compat", XkbIM_UseCompat },
+ { "any", XkbIM_UseAnyMods },
+ { "none", 0 },
+ { NULL, 0 }
+};
+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/xkbcomp/indicators.h b/xkbcomp/indicators.h
new file mode 100644
index 000000000..041cacc17
--- /dev/null
+++ b/xkbcomp/indicators.h
@@ -0,0 +1,95 @@
+/* $Xorg: indicators.h,v 1.3 2000/08/17 19:54:32 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86$ */
+
+#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/xkbcomp/install-sh b/xkbcomp/install-sh
new file mode 100644
index 000000000..a5897de6e
--- /dev/null
+++ b/xkbcomp/install-sh
@@ -0,0 +1,519 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2006-12-25.00
+
+# 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-end: "$"
+# End:
diff --git a/xkbcomp/keycodes.c b/xkbcomp/keycodes.c
new file mode 100644
index 000000000..a86592e4d
--- /dev/null
+++ b/xkbcomp/keycodes.c
@@ -0,0 +1,749 @@
+/* $Xorg: keycodes.c,v 1.4 2000/08/17 19:54:32 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86$ */
+
+#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;
+ int errorCount;
+ unsigned fileID;
+ unsigned merge;
+ int computedMin;
+ int computedMax;
+ int explicitMin;
+ int explicitMax;
+ int effectiveMin;
+ int effectiveMax;
+ unsigned long names[XkbMaxLegalKeyCode+1];
+ unsigned files[XkbMaxLegalKeyCode+1];
+ unsigned char has_alt_forms[XkbMaxLegalKeyCode+1];
+ IndicatorNameInfo * leds;
+ AliasInfo * aliases;
+} KeyNamesInfo;
+
+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;
+const char *action;
+
+ 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;
+ action= "Using %s instead of %s\n";
+ }
+ else {
+ action= "Identical definitions ignored\n";
+ }
+ ACTION2(action,(old->virtual?"virtual":"real"),
+ (old->virtual?"real":"virtual"));
+ return True;
+ }
+ else {
+ if (replace) action= "Ignoring %d, using %d\n";
+ else action= "Using %d, ignoring %d\n";
+ ACTION2(action,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;
+}
+
+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;
+}
+
+typedef void (*FileHandler)(
+ XkbFile * /* rtrn */,
+ XkbDescPtr /* xkb */,
+ unsigned /* merge */,
+ KeyNamesInfo * /* included */
+);
+
+static Bool
+HandleIncludeKeycodes( IncludeStmt * stmt,
+ XkbDescPtr xkb,
+ KeyNamesInfo * info,
+ FileHandler hndlr)
+{
+unsigned newMerge;
+XkbFile * rtrn;
+KeyNamesInfo included;
+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);
+ }
+ else if (ProcessIncludeFile(stmt,XkmKeyNamesIndex,&rtrn,&newMerge)) {
+ InitKeyNamesInfo(&included);
+ (*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;
+ 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);
+ (*hndlr)(rtrn,xkb,MergeOverride,&next_incl);
+ MergeIncludedKeycodes(&included,&next_incl,op);
+ ClearKeyNamesInfo(&next_incl);
+ }
+ else {
+ info->errorCount+= 10;
+ return False;
+ }
+ }
+ }
+ if (haveSelf)
+ *info= included;
+ else {
+ MergeIncludedKeycodes(info,&included,newMerge);
+ ClearKeyNamesInfo(&included);
+ }
+ return (info->errorCount==0);
+}
+
+static int
+HandleKeycodeDef( KeycodeDef * stmt,
+ XkbDescPtr xkb,
+ 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
+
+static int
+HandleKeyNameVar(VarDef *stmt,XkbDescPtr xkb,unsigned merge,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,
+ XkbDescPtr xkb,
+ 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];
+ sprintf(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;
+}
+
+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:
+ if (!HandleIncludeKeycodes((IncludeStmt *)stmt,xkb,info,
+ HandleKeycodesFile))
+ info->errorCount++;
+ break;
+ case StmtKeycodeDef:
+ if (!HandleKeycodeDef((KeycodeDef *)stmt,xkb,merge,info))
+ info->errorCount++;
+ break;
+ case StmtKeyAliasDef:
+ if (!HandleAliasDef((KeyAliasDef *)stmt,
+ merge,info->fileID,&info->aliases))
+ info->errorCount++;
+ break;
+ case StmtVarDef:
+ if (!HandleKeyNameVar((VarDef *)stmt,xkb,merge,info))
+ info->errorCount++;
+ break;
+ case StmtIndicatorNameDef:
+ if (!HandleIndicatorNameDef((IndicatorNameDef *)stmt,xkb,
+ 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;
+}
+
+Bool
+CompileKeycodes(XkbFile *file,XkbFileInfo *result,unsigned merge)
+{
+KeyNamesInfo info;
+XkbDescPtr xkb;
+
+ xkb= result->xkb;
+ InitKeyNamesInfo(&info);
+ HandleKeycodesFile(file,xkb,merge,&info);
+
+ if (info.errorCount==0) {
+ if (info.explicitMin>0)
+ xkb->min_key_code= info.effectiveMin;
+ else xkb->min_key_code= info.computedMin;
+ if (info.explicitMax>0)
+ 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/xkbcomp/keycodes.h b/xkbcomp/keycodes.h
new file mode 100644
index 000000000..9333718cc
--- /dev/null
+++ b/xkbcomp/keycodes.h
@@ -0,0 +1,44 @@
+/* $Xorg: keycodes.h,v 1.3 2000/08/17 19:54:32 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86$ */
+
+#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/xkbcomp/keymap.c b/xkbcomp/keymap.c
new file mode 100644
index 000000000..86e9c9e8f
--- /dev/null
+++ b/xkbcomp/keymap.c
@@ -0,0 +1,168 @@
+/* $Xorg: keymap.c,v 1.3 2000/08/17 19:54:32 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86$ */
+
+#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
+
+XkbFile * sections[MAX_SECTIONS];
+
+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:
+ 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;
+ 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;
+ }
+ 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/xkbcomp/keytypes.c b/xkbcomp/keytypes.c
new file mode 100644
index 000000000..b09345b79
--- /dev/null
+++ b/xkbcomp/keytypes.c
@@ -0,0 +1,1159 @@
+/* $Xorg: keytypes.c,v 1.3 2000/08/17 19:54:32 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86: xc/programs/xkbcomp/keytypes.c,v 1.4 2001/01/17 23:45:44 dawes Exp $ */
+
+#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;
+}
+
+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;
+}
+
+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;
+ entry.mods.vmods= (rtrn.uval>>8)&0xffff;
+ 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);
+}
+
+/***====================================================================***/
+
+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");
+ }
+ 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;
+ vmods= (tmp.uval>>8)&0xffff;
+ 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;
+}
+
+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= 0;
+ 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;
+
+ 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);
+ }
+ }
+ if (!AddKeyType(xkb,info,&type)) {
+ info->errorCount++;
+ return False;
+ }
+ return True;
+}
+
+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:
+ if (!HandleKeyTypeDef((KeyTypeDef *)stmt,xkb,merge,info))
+ info->errorCount++;
+ break;
+ case StmtVarDef:
+ if (!HandleKeyTypeVar((VarDef *)stmt,xkb,info))
+ info->errorCount++;
+ break;
+ case StmtVModDef:
+ 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!=None) {
+ 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/xkbcomp/listing.c b/xkbcomp/listing.c
new file mode 100644
index 000000000..cc887b80d
--- /dev/null
+++ b/xkbcomp/listing.c
@@ -0,0 +1,462 @@
+/* $Xorg: listing.c,v 1.5 2001/02/09 02:05:49 xorgcvs Exp $ */
+/************************************************************
+ 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.
+
+******************************************************************/
+/* $XFree86: xc/programs/xkbcomp/listing.c,v 3.9 2001/12/14 20:01:57 dawes Exp $ */
+
+
+#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_NOT_LOCAL
+#define DEBUG_VAR listingDebug
+#include "xkbcomp.h"
+#include <stdlib.h>
+#ifndef X_NOT_POSIX
+#ifdef _POSIX_SOURCE
+#include <limits.h>
+#else
+#define _POSIX_SOURCE
+#include <limits.h>
+#undef _POSIX_SOURCE
+#endif
+#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
+#define FileName(file) file->d_name
+#ifndef X_NOT_POSIX
+#include <dirent.h>
+#else
+#ifdef SYSV
+#include <dirent.h>
+#else
+#ifdef USG
+#include <dirent.h>
+#else
+#include <sys/dir.h>
+#ifndef dirent
+#define dirent direct
+#endif
+#endif
+#endif
+#endif
+#endif
+
+#include "xkbpath.h"
+#include "parseutils.h"
+#include "misc.h"
+#include "tokens.h"
+#include <X11/extensions/XKBgeom.h>
+
+#define lowbit(x) ((x) & (-(x)))
+
+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/xkbcomp/misc.c b/xkbcomp/misc.c
new file mode 100644
index 000000000..91688f739
--- /dev/null
+++ b/xkbcomp/misc.c
@@ -0,0 +1,502 @@
+/* $Xorg: misc.c,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86: xc/programs/xkbcomp/misc.c,v 3.4 2001/01/17 23:45:44 dawes Exp $ */
+
+#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>
+
+/***====================================================================***/
+
+Bool
+ProcessIncludeFile( IncludeStmt * stmt,
+ unsigned file_type,
+ XkbFile ** file_rtrn,
+ unsigned * merge_rtrn)
+{
+FILE *file;
+XkbFile *rtrn,*mapToUse;
+char oldFile[1024];
+int oldLine = lineNum;
+
+ rtrn= XkbFindFileInCache(stmt->file,file_type,&stmt->path);
+ if (rtrn==NULL) {
+ 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);
+ 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;
+
+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;
+
+ 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);
+ }
+ sprintf(xkb->names->keys[i].name,"U%03d",nUnknown++);
+ }
+ 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);
+ sprintf(xkb->names->keys[i].name,"U%03d",nUnknown++);
+ }
+ }
+ }
+ }
+ return Success;
+}
+
+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;
+ }
+ }
+ 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/xkbcomp/misc.h b/xkbcomp/misc.h
new file mode 100644
index 000000000..fd16db482
--- /dev/null
+++ b/xkbcomp/misc.h
@@ -0,0 +1,126 @@
+/* $Xorg: misc.h,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86$ */
+
+#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/xkbcomp/missing b/xkbcomp/missing
new file mode 100644
index 000000000..1c8ff7049
--- /dev/null
+++ b/xkbcomp/missing
@@ -0,0 +1,367 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2006-05-10.23
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006
+# 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, 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.
+
+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]
+
+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
+
+# 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).
+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 $1 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 1
+ 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-end: "$"
+# End:
diff --git a/xkbcomp/parseutils.c b/xkbcomp/parseutils.c
new file mode 100644
index 000000000..bae18f902
--- /dev/null
+++ b/xkbcomp/parseutils.c
@@ -0,0 +1,748 @@
+/* $Xorg: parseutils.c,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86$ */
+
+#define DEBUG_VAR_NOT_LOCAL
+#define DEBUG_VAR parseDebug
+#include "parseutils.h"
+#include "xkbpath.h"
+#include <X11/keysym.h>
+#include <X11/extensions/XKBgeom.h>
+#include <X11/Xalloca.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(KeySym sym,ExprDef *match)
+{
+InterpDef *def;
+
+ def= uTypedAlloc(InterpDef);
+ if (def) {
+ def->common.stmtType= StmtInterpDef;
+ def->common.next= NULL;
+ def->sym= sym;
+ 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(KeySym sym)
+{
+ExprDef *def;
+
+ def= ExprCreate(ExprKeysymList,TypeSymbols);
+ if (def) {
+ def->value.list.nSyms= 1;
+ def->value.list.szSyms= 2;
+ def->value.list.syms= uTypedCalloc(2,KeySym);
+ 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,KeySym 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,
+ KeySym);
+ 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(char *str,KeySym *sym_rtrn)
+{
+KeySym sym;
+
+ 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;
+ }
+ 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,"0x%x",stmt);
+ if (stmt) {
+ do {
+ fprintf(stderr,"->0x%x",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/xkbcomp/parseutils.h b/xkbcomp/parseutils.h
new file mode 100644
index 000000000..a431fac74
--- /dev/null
+++ b/xkbcomp/parseutils.h
@@ -0,0 +1,248 @@
+/* $Xorg: parseutils.h,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86$ */
+
+#ifndef XKBPARSE_H
+#define XKBPARSE_H 1
+
+#ifndef DEBUG_VAR
+#define DEBUG_VAR parseDebug
+#endif
+
+#include "xkbcomp.h"
+
+extern char *scanStr;
+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(
+ KeySym /* sym */,
+ 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(
+ KeySym /* 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 */,
+ KeySym /* sym */
+);
+
+extern int LookupKeysym(
+ 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/xkbcomp/symbols.c b/xkbcomp/symbols.c
new file mode 100644
index 000000000..ffc26b2fd
--- /dev/null
+++ b/xkbcomp/symbols.c
@@ -0,0 +1,1921 @@
+/* $Xorg: symbols.c,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86: xc/programs/xkbcomp/symbols.c,v 3.15 2003/04/19 12:25:31 pascal Exp $ */
+
+#include "xkbcomp.h"
+#include "tokens.h"
+#include "expr.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"
+
+extern Atom tok_ONE_LEVEL;
+extern Atom tok_TWO_LEVEL;
+extern Atom tok_KEYPAD;
+
+/***====================================================================***/
+
+#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;
+ 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;
+
+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;
+}
+
+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;
+ return;
+}
+
+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;
+ 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);
+ memcpy((char *)key->syms[ndx],(char *)value->value.list.syms,
+ nSyms*sizeof(KeySym));
+ 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;
+}
+
+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);
+}
+
+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);
+ }
+ return ((width>=0)&&(width<=4));
+}
+
+static void
+PrepareKeyDef(KeyInfo *key)
+{
+ int i, j, width, defined, lastGroup;
+ Bool identical;
+
+ defined = key->symsDefined | key->actsDefined | key->typesDefined;
+ 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;
+}
+
+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);
+ 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;
+ 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;
+ }
+ 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;
+ }
+
+ 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++) {
+ xkb->map->key_sym_map[kc].kt_index[i]= types[i];
+ if (key->syms[i]!=NULL) {
+ 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;
+ }
+ 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;
+}
+
+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;
+ 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;
+ }
+ 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];
+ }
+ for (key=info.keys,i=0;i<info.nKeys;i++,key++) {
+ PrepareKeyDef(key);
+ }
+ 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/xkbcomp/tokens.h b/xkbcomp/tokens.h
new file mode 100644
index 000000000..c63c393a7
--- /dev/null
+++ b/xkbcomp/tokens.h
@@ -0,0 +1,100 @@
+/* $Xorg: tokens.h,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */
+/************************************************************
+ 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
+
+#endif
diff --git a/xkbcomp/utils.c b/xkbcomp/utils.c
new file mode 100644
index 000000000..aa4dc8987
--- /dev/null
+++ b/xkbcomp/utils.c
@@ -0,0 +1,411 @@
+
+ /*\
+ * $Xorg: utils.c,v 1.4 2000/08/17 19:54:33 cpqbld Exp $
+ *
+ * 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.
+ \*/
+/* $XFree86: xc/programs/xkbcomp/utils.c,v 3.6 2001/07/25 15:05:24 dawes Exp $ */
+
+#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/xkbcomp/utils.h b/xkbcomp/utils.h
new file mode 100644
index 000000000..ab84a4f7b
--- /dev/null
+++ b/xkbcomp/utils.h
@@ -0,0 +1,422 @@
+#ifndef UTILS_H
+#define UTILS_H 1
+
+ /*\
+ * $Xorg: utils.h,v 1.3 2000/08/17 19:54:33 cpqbld Exp $
+ *
+ * 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.
+ \*/
+/* $XFree86: xc/programs/xkbcomp/utils.h,v 3.5 2002/06/05 00:00:37 dawes Exp $ */
+
+/***====================================================================***/
+
+#include <stdio.h>
+#include <X11/Xos.h>
+#include <X11/Xfuncproto.h>
+#include <X11/Xfuncs.h>
+
+#include <stddef.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
+
+#if 0
+typedef union {
+ int i;
+ unsigned u;
+ void *p;
+ void *(*fp)();
+} Union;
+#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 */, ...
+)
+#if defined(__GNUC__) && \
+ ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6)))
+__attribute__((format(printf, 1, 2)))
+#endif
+;
+
+#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 */, ...
+)
+#if defined(__GNUC__) && \
+ ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6)))
+__attribute__((format(printf, 1, 2)))
+#endif
+;
+
+#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 */, ...
+)
+#if defined(__GNUC__) && \
+ ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6)))
+__attribute__((format(printf, 1, 2)))
+#endif
+;
+
+#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 */, ...
+)
+#if defined(__GNUC__) && \
+ ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6)))
+__attribute__((format(printf, 1, 2)))
+#endif
+;
+
+#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 */, ...
+)
+#if defined(__GNUC__) && \
+ ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6)))
+__attribute__((format(printf, 1, 2)))
+#endif
+;
+
+/* 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 */, ...
+)
+#if defined(__GNUC__) && \
+ ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6)))
+__attribute__((format(printf, 1, 2)))
+#endif
+;
+
+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
+#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
+#define uStringDup(s1) (strdup(s1))
+#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
+
+#ifdef DEBUG_VAR_NOT_LOCAL
+extern
+#endif
+unsigned int DEBUG_VAR;
+
+extern void uDebug(
+ char * /* s */, ...
+)
+#if defined(__GNUC__) && \
+ ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6)))
+__attribute__((format(printf, 1, 2)))
+#endif
+;
+
+extern void uDebugNOI( /* no indent */
+ char * /* s */, ...
+)
+#if defined(__GNUC__) && \
+ ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6)))
+__attribute__((format(printf, 1, 2)))
+#endif
+;
+
+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 */, ...
+)
+#if defined(__GNUC__) && \
+ ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6)))
+__attribute__((format(printf, 2, 3)))
+#endif
+;
+
+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/xkbcomp/vmod.c b/xkbcomp/vmod.c
new file mode 100644
index 000000000..9a8bd0d87
--- /dev/null
+++ b/xkbcomp/vmod.c
@@ -0,0 +1,225 @@
+/* $Xorg: vmod.c,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86: xc/programs/xkbcomp/vmod.c,v 3.3 2001/01/17 23:45:45 dawes Exp $ */
+
+#define DEBUG_VAR_NOT_LOCAL
+#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;
+}
+
+/***====================================================================***/
+
+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;
+}
+
+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;
+ }
+ fieldStr= XkbAtomGetString(xkb->dpy,field);
+ if (fieldStr==NULL)
+ return False;
+ 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;
+}
+
+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/xkbcomp/vmod.h b/xkbcomp/vmod.h
new file mode 100644
index 000000000..231d2c8ba
--- /dev/null
+++ b/xkbcomp/vmod.h
@@ -0,0 +1,87 @@
+/* $Xorg: vmod.h,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86$ */
+
+#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/xkbcomp.c b/xkbcomp/xkbcomp.c
new file mode 100644
index 000000000..111a7b371
--- /dev/null
+++ b/xkbcomp/xkbcomp.c
@@ -0,0 +1,986 @@
+/* $Xorg: xkbcomp.c,v 1.4 2000/08/17 19:54:33 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86: xc/programs/xkbcomp/xkbcomp.c,v 3.20 2003/09/24 02:43:38 dawes Exp $ */
+
+#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_NOT_LOCAL
+#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
+
+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");
+ 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],"-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,':')==0) {
+#else
+ else if ((strchr(inputFile,':')==0) || (
+ strlen(inputFile) > 2 &&
+ isalpha(inputFile[0]) &&
+ inputFile[1] == ':' && strchr(inputFile + 2,':')==NULL)) {
+#endif
+ int len;
+ len= strlen(inputFile);
+ if (inputFile[len-1]==')') {
+ char *tmp;
+ if ((tmp=strchr(inputFile,'('))!=0) {
+ *tmp= '\0'; inputFile[len-1]= '\0';
+ tmp++;
+ if (*tmp=='\0') {
+ WARN("Empty map in filename\n");
+ ACTION("Ignored\n");
+ }
+ else if (inputMap==NULL) {
+ inputMap= uStringDup(tmp);
+ }
+ else {
+ WARN("Map specified in filename and with -m flag\n");
+ ACTION1("map from name (\"%s\") ignored\n",tmp);
+ }
+ }
+ 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]==':')
+ sprintf(name=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;
+}
+
+/***====================================================================***/
+
+extern int yydebug;
+
+int
+main(int argc,char *argv[])
+{
+FILE * file;
+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)&&(XKBParseFile(file,&rtrn)&&(rtrn!=NULL))){
+ fclose(file);
+ mapToUse= rtrn;
+ if (inputMap!=NULL) {
+ 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) {
+ 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;
+ }
+ }
+ else if (inputFormat==INPUT_XKM) {
+ 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;
+ }
+ }
+ 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) {
+ fclose(out);
+ if (!ok) {
+ ERROR2("%s in %s\n",_XkbErrMessages[_XkbErrCode],
+ _XkbErrLocation?_XkbErrLocation:"unknown");
+ 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/xkbcomp.h b/xkbcomp/xkbcomp.h
new file mode 100644
index 000000000..b9b9caed1
--- /dev/null
+++ b/xkbcomp/xkbcomp.h
@@ -0,0 +1,380 @@
+/* $Xorg: xkbcomp.h,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86: xc/programs/xkbcomp/xkbcomp.h,v 3.8 2001/12/19 21:30:30 dawes Exp $ */
+
+#ifndef XKBCOMP_H
+#define XKBCOMP_H 1
+
+#ifndef DEBUG_VAR
+#define DEBUG_VAR_NOT_LOCAL
+#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;
+ KeySym * 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;
+} 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/xkbcomp.man b/xkbcomp/xkbcomp.man
new file mode 100644
index 000000000..aa18d3e72
--- /dev/null
+++ b/xkbcomp/xkbcomp.man
@@ -0,0 +1,109 @@
+.\" $Xorg: xkbcomp.man,v 1.3 2000/08/17 19:54:33 cpqbld Exp $
+.\"
+.\"
+.\"
+.\"
+.\" $XFree86: xc/programs/xkbcomp/xkbcomp.man,v 1.11 2003/07/28 21:57:02 herrb Exp $
+.\"
+.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 \-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 \-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/xkbcomp/xkbparse.c b/xkbcomp/xkbparse.c
new file mode 100644
index 000000000..75fc1b106
--- /dev/null
+++ b/xkbcomp/xkbparse.c
@@ -0,0 +1,3163 @@
+/* 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 93 "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>
+
+
+
+
+/* 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 111 "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 268 "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 281 "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, 169, 169, 171, 173, 177, 179, 183, 189, 190,
+ 191, 194, 196, 200, 206, 211, 212, 213, 214, 215,
+ 218, 219, 222, 223, 226, 227, 228, 229, 230, 231,
+ 232, 233, 236, 238, 241, 246, 251, 256, 261, 266,
+ 271, 276, 281, 286, 291, 296, 301, 306, 311, 323,
+ 325, 327, 331, 342, 352, 356, 358, 362, 364, 368,
+ 377, 379, 383, 385, 389, 395, 401, 403, 405, 408,
+ 410, 412, 414, 416, 420, 422, 426, 430, 434, 438,
+ 440, 444, 446, 454, 458, 460, 464, 466, 468, 470,
+ 472, 476, 478, 482, 484, 488, 490, 494, 496, 500,
+ 504, 509, 513, 517, 519, 523, 525, 527, 531, 533,
+ 537, 547, 551, 552, 553, 554, 557, 558, 561, 563,
+ 565, 567, 569, 571, 573, 575, 577, 579, 581, 585,
+ 586, 589, 590, 591, 592, 593, 596, 597, 600, 602,
+ 606, 608, 610, 612, 614, 616, 620, 622, 624, 626,
+ 628, 630, 632, 634, 638, 640, 644, 648, 655, 663,
+ 672, 683, 690, 697, 704, 715, 716, 719, 721, 725,
+ 739, 743, 750, 751, 754, 755, 758, 761, 764, 767,
+ 768, 771, 774, 775, 778
+};
+#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
+
+
+
+#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 */
+
+
+/*-----------------------------------------------.
+| 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;
+ }
+}
+
+
+/* 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 170 "xkbparse.y"
+ { (yyval.file)= rtrnValue= (yyvsp[(1) - (1)].file); }
+ break;
+
+ case 3:
+#line 172 "xkbparse.y"
+ { (yyval.file)= rtrnValue= (yyvsp[(1) - (1)].file); }
+ break;
+
+ case 4:
+#line 174 "xkbparse.y"
+ { (yyval.file)= rtrnValue= (yyvsp[(1) - (1)].file); }
+ break;
+
+ case 5:
+#line 178 "xkbparse.y"
+ { (yyval.file)= (XkbFile *)AppendStmt(&(yyvsp[(1) - (2)].file)->common,&(yyvsp[(2) - (2)].file)->common); }
+ break;
+
+ case 6:
+#line 180 "xkbparse.y"
+ { (yyval.file)= (yyvsp[(1) - (1)].file); }
+ break;
+
+ case 7:
+#line 186 "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 189 "xkbparse.y"
+ { (yyval.uval)= XkmKeymapFile; }
+ break;
+
+ case 9:
+#line 190 "xkbparse.y"
+ { (yyval.uval)= XkmSemanticsFile; }
+ break;
+
+ case 10:
+#line 191 "xkbparse.y"
+ { (yyval.uval)= XkmLayoutFile; }
+ break;
+
+ case 11:
+#line 195 "xkbparse.y"
+ { (yyval.file)= (XkbFile *)AppendStmt(&(yyvsp[(1) - (2)].file)->common,&(yyvsp[(2) - (2)].file)->common); }
+ break;
+
+ case 12:
+#line 197 "xkbparse.y"
+ { (yyval.file)= (yyvsp[(1) - (1)].file); }
+ break;
+
+ case 13:
+#line 203 "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 207 "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 211 "xkbparse.y"
+ { (yyval.uval)= XkmKeyNamesIndex; }
+ break;
+
+ case 16:
+#line 212 "xkbparse.y"
+ { (yyval.uval)= XkmTypesIndex; }
+ break;
+
+ case 17:
+#line 213 "xkbparse.y"
+ { (yyval.uval)= XkmCompatMapIndex; }
+ break;
+
+ case 18:
+#line 214 "xkbparse.y"
+ { (yyval.uval)= XkmSymbolsIndex; }
+ break;
+
+ case 19:
+#line 215 "xkbparse.y"
+ { (yyval.uval)= XkmGeometryIndex; }
+ break;
+
+ case 20:
+#line 218 "xkbparse.y"
+ { (yyval.uval)= (yyvsp[(1) - (1)].uval); }
+ break;
+
+ case 21:
+#line 219 "xkbparse.y"
+ { (yyval.uval)= 0; }
+ break;
+
+ case 22:
+#line 222 "xkbparse.y"
+ { (yyval.uval)= (((yyvsp[(1) - (2)].uval))|((yyvsp[(2) - (2)].uval))); }
+ break;
+
+ case 23:
+#line 223 "xkbparse.y"
+ { (yyval.uval)= (yyvsp[(1) - (1)].uval); }
+ break;
+
+ case 24:
+#line 226 "xkbparse.y"
+ { (yyval.uval)= XkbLC_Partial; }
+ break;
+
+ case 25:
+#line 227 "xkbparse.y"
+ { (yyval.uval)= XkbLC_Default; }
+ break;
+
+ case 26:
+#line 228 "xkbparse.y"
+ { (yyval.uval)= XkbLC_Hidden; }
+ break;
+
+ case 27:
+#line 229 "xkbparse.y"
+ { (yyval.uval)= XkbLC_AlphanumericKeys; }
+ break;
+
+ case 28:
+#line 230 "xkbparse.y"
+ { (yyval.uval)= XkbLC_ModifierKeys; }
+ break;
+
+ case 29:
+#line 231 "xkbparse.y"
+ { (yyval.uval)= XkbLC_KeypadKeys; }
+ break;
+
+ case 30:
+#line 232 "xkbparse.y"
+ { (yyval.uval)= XkbLC_FunctionKeys; }
+ break;
+
+ case 31:
+#line 233 "xkbparse.y"
+ { (yyval.uval)= XkbLC_AlternateGroup; }
+ break;
+
+ case 32:
+#line 237 "xkbparse.y"
+ { (yyval.any)= AppendStmt((yyvsp[(1) - (2)].any),(yyvsp[(2) - (2)].any)); }
+ break;
+
+ case 33:
+#line 238 "xkbparse.y"
+ { (yyval.any)= NULL; }
+ break;
+
+ case 34:
+#line 242 "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 247 "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 252 "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 257 "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 262 "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 267 "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 272 "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 277 "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 282 "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 287 "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 292 "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 297 "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 302 "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 307 "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 312 "xkbparse.y"
+ {
+ if ((yyvsp[(1) - (2)].uval)==MergeAltForm) {
+ yyerror("cannot use 'alternate' to include other maps");
+ (yyval.any)= &IncludeCreate(scanStr,MergeDefault)->common;
+ }
+ else {
+ (yyval.any)= &IncludeCreate(scanStr,(yyvsp[(1) - (2)].uval))->common;
+ }
+ }
+ break;
+
+ case 49:
+#line 324 "xkbparse.y"
+ { (yyval.var)= VarCreate((yyvsp[(1) - (4)].expr),(yyvsp[(3) - (4)].expr)); }
+ break;
+
+ case 50:
+#line 326 "xkbparse.y"
+ { (yyval.var)= BoolVarCreate((yyvsp[(1) - (2)].sval),1); }
+ break;
+
+ case 51:
+#line 328 "xkbparse.y"
+ { (yyval.var)= BoolVarCreate((yyvsp[(2) - (3)].sval),0); }
+ break;
+
+ case 52:
+#line 332 "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 343 "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 353 "xkbparse.y"
+ { (yyval.vmod)= (yyvsp[(2) - (3)].vmod); }
+ break;
+
+ case 55:
+#line 357 "xkbparse.y"
+ { (yyval.vmod)= (VModDef *)AppendStmt(&(yyvsp[(1) - (3)].vmod)->common,&(yyvsp[(3) - (3)].vmod)->common); }
+ break;
+
+ case 56:
+#line 359 "xkbparse.y"
+ { (yyval.vmod)= (yyvsp[(1) - (1)].vmod); }
+ break;
+
+ case 57:
+#line 363 "xkbparse.y"
+ { (yyval.vmod)= VModCreate((yyvsp[(1) - (1)].sval),NULL); }
+ break;
+
+ case 58:
+#line 365 "xkbparse.y"
+ { (yyval.vmod)= VModCreate((yyvsp[(1) - (3)].sval),(yyvsp[(3) - (3)].expr)); }
+ break;
+
+ case 59:
+#line 371 "xkbparse.y"
+ {
+ (yyvsp[(2) - (6)].interp)->def= (yyvsp[(4) - (6)].var);
+ (yyval.interp)= (yyvsp[(2) - (6)].interp);
+ }
+ break;
+
+ case 60:
+#line 378 "xkbparse.y"
+ { (yyval.interp)= InterpCreate((KeySym)(yyvsp[(1) - (3)].uval),(yyvsp[(3) - (3)].expr)); }
+ break;
+
+ case 61:
+#line 380 "xkbparse.y"
+ { (yyval.interp)= InterpCreate((KeySym)(yyvsp[(1) - (1)].uval),NULL); }
+ break;
+
+ case 62:
+#line 384 "xkbparse.y"
+ { (yyval.var)= (VarDef *)AppendStmt(&(yyvsp[(1) - (2)].var)->common,&(yyvsp[(2) - (2)].var)->common); }
+ break;
+
+ case 63:
+#line 386 "xkbparse.y"
+ { (yyval.var)= (yyvsp[(1) - (1)].var); }
+ break;
+
+ case 64:
+#line 392 "xkbparse.y"
+ { (yyval.keyType)= KeyTypeCreate((yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].var)); }
+ break;
+
+ case 65:
+#line 398 "xkbparse.y"
+ { (yyval.syms)= SymbolsCreate((yyvsp[(2) - (6)].str),(ExprDef *)(yyvsp[(4) - (6)].var)); }
+ break;
+
+ case 66:
+#line 402 "xkbparse.y"
+ { (yyval.var)= (VarDef *)AppendStmt(&(yyvsp[(1) - (3)].var)->common,&(yyvsp[(3) - (3)].var)->common); }
+ break;
+
+ case 67:
+#line 404 "xkbparse.y"
+ { (yyval.var)= (yyvsp[(1) - (1)].var); }
+ break;
+
+ case 68:
+#line 405 "xkbparse.y"
+ { (yyval.var)= NULL; }
+ break;
+
+ case 69:
+#line 409 "xkbparse.y"
+ { (yyval.var)= VarCreate((yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); }
+ break;
+
+ case 70:
+#line 411 "xkbparse.y"
+ { (yyval.var)= VarCreate((yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); }
+ break;
+
+ case 71:
+#line 413 "xkbparse.y"
+ { (yyval.var)= BoolVarCreate((yyvsp[(1) - (1)].sval),1); }
+ break;
+
+ case 72:
+#line 415 "xkbparse.y"
+ { (yyval.var)= BoolVarCreate((yyvsp[(2) - (2)].sval),0); }
+ break;
+
+ case 73:
+#line 417 "xkbparse.y"
+ { (yyval.var)= VarCreate(NULL,(yyvsp[(1) - (1)].expr)); }
+ break;
+
+ case 74:
+#line 421 "xkbparse.y"
+ { (yyval.expr)= (yyvsp[(2) - (3)].expr); }
+ break;
+
+ case 75:
+#line 423 "xkbparse.y"
+ { (yyval.expr)= ExprCreateUnary(ExprActionList,TypeAction,(yyvsp[(2) - (3)].expr)); }
+ break;
+
+ case 76:
+#line 427 "xkbparse.y"
+ { (yyval.groupCompat)= GroupCompatCreate((yyvsp[(2) - (5)].ival),(yyvsp[(4) - (5)].expr)); }
+ break;
+
+ case 77:
+#line 431 "xkbparse.y"
+ { (yyval.modMask)= ModMapCreate((yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].expr)); }
+ break;
+
+ case 78:
+#line 435 "xkbparse.y"
+ { (yyval.ledMap)= IndicatorMapCreate((yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].var)); }
+ break;
+
+ case 79:
+#line 439 "xkbparse.y"
+ { (yyval.ledName)= IndicatorNameCreate((yyvsp[(2) - (5)].ival),(yyvsp[(4) - (5)].expr),False); }
+ break;
+
+ case 80:
+#line 441 "xkbparse.y"
+ { (yyval.ledName)= IndicatorNameCreate((yyvsp[(3) - (6)].ival),(yyvsp[(5) - (6)].expr),True); }
+ break;
+
+ case 81:
+#line 445 "xkbparse.y"
+ { (yyval.shape)= ShapeDeclCreate((yyvsp[(2) - (6)].sval),(OutlineDef *)&(yyvsp[(4) - (6)].outline)->common); }
+ break;
+
+ case 82:
+#line 447 "xkbparse.y"
+ {
+ OutlineDef *outlines;
+ outlines= OutlineCreate(None,(yyvsp[(4) - (6)].expr));
+ (yyval.shape)= ShapeDeclCreate((yyvsp[(2) - (6)].sval),outlines);
+ }
+ break;
+
+ case 83:
+#line 455 "xkbparse.y"
+ { (yyval.section)= SectionDeclCreate((yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].row)); }
+ break;
+
+ case 84:
+#line 459 "xkbparse.y"
+ { (yyval.row)=(RowDef *)AppendStmt(&(yyvsp[(1) - (2)].row)->common,&(yyvsp[(2) - (2)].row)->common);}
+ break;
+
+ case 85:
+#line 461 "xkbparse.y"
+ { (yyval.row)= (yyvsp[(1) - (1)].row); }
+ break;
+
+ case 86:
+#line 465 "xkbparse.y"
+ { (yyval.row)= RowDeclCreate((yyvsp[(3) - (5)].key)); }
+ break;
+
+ case 87:
+#line 467 "xkbparse.y"
+ { (yyval.row)= (RowDef *)(yyvsp[(1) - (1)].var); }
+ break;
+
+ case 88:
+#line 469 "xkbparse.y"
+ { (yyval.row)= (RowDef *)(yyvsp[(1) - (1)].doodad); }
+ break;
+
+ case 89:
+#line 471 "xkbparse.y"
+ { (yyval.row)= (RowDef *)(yyvsp[(1) - (1)].ledMap); }
+ break;
+
+ case 90:
+#line 473 "xkbparse.y"
+ { (yyval.row)= (RowDef *)(yyvsp[(1) - (1)].overlay); }
+ break;
+
+ case 91:
+#line 477 "xkbparse.y"
+ { (yyval.key)=(KeyDef *)AppendStmt(&(yyvsp[(1) - (2)].key)->common,&(yyvsp[(2) - (2)].key)->common);}
+ break;
+
+ case 92:
+#line 479 "xkbparse.y"
+ { (yyval.key)= (yyvsp[(1) - (1)].key); }
+ break;
+
+ case 93:
+#line 483 "xkbparse.y"
+ { (yyval.key)= (yyvsp[(3) - (5)].key); }
+ break;
+
+ case 94:
+#line 485 "xkbparse.y"
+ { (yyval.key)= (KeyDef *)(yyvsp[(1) - (1)].var); }
+ break;
+
+ case 95:
+#line 489 "xkbparse.y"
+ { (yyval.key)=(KeyDef *)AppendStmt(&(yyvsp[(1) - (3)].key)->common,&(yyvsp[(3) - (3)].key)->common);}
+ break;
+
+ case 96:
+#line 491 "xkbparse.y"
+ { (yyval.key)= (yyvsp[(1) - (1)].key); }
+ break;
+
+ case 97:
+#line 495 "xkbparse.y"
+ { (yyval.key)= KeyDeclCreate((yyvsp[(1) - (1)].str),NULL); }
+ break;
+
+ case 98:
+#line 497 "xkbparse.y"
+ { (yyval.key)= KeyDeclCreate(NULL,(yyvsp[(2) - (3)].expr)); }
+ break;
+
+ case 99:
+#line 501 "xkbparse.y"
+ { (yyval.overlay)= OverlayDeclCreate((yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].olKey)); }
+ break;
+
+ case 100:
+#line 505 "xkbparse.y"
+ {
+ (yyval.olKey)= (OverlayKeyDef *)
+ AppendStmt(&(yyvsp[(1) - (3)].olKey)->common,&(yyvsp[(3) - (3)].olKey)->common);
+ }
+ break;
+
+ case 101:
+#line 510 "xkbparse.y"
+ { (yyval.olKey)= (yyvsp[(1) - (1)].olKey); }
+ break;
+
+ case 102:
+#line 514 "xkbparse.y"
+ { (yyval.olKey)= OverlayKeyCreate((yyvsp[(1) - (3)].str),(yyvsp[(3) - (3)].str)); }
+ break;
+
+ case 103:
+#line 518 "xkbparse.y"
+ { (yyval.outline)=(OutlineDef *)AppendStmt(&(yyvsp[(1) - (3)].outline)->common,&(yyvsp[(3) - (3)].outline)->common);}
+ break;
+
+ case 104:
+#line 520 "xkbparse.y"
+ { (yyval.outline)= (yyvsp[(1) - (1)].outline); }
+ break;
+
+ case 105:
+#line 524 "xkbparse.y"
+ { (yyval.outline)= OutlineCreate(None,(yyvsp[(2) - (3)].expr)); }
+ break;
+
+ case 106:
+#line 526 "xkbparse.y"
+ { (yyval.outline)= OutlineCreate((yyvsp[(1) - (5)].sval),(yyvsp[(4) - (5)].expr)); }
+ break;
+
+ case 107:
+#line 528 "xkbparse.y"
+ { (yyval.outline)= OutlineCreate((yyvsp[(1) - (3)].sval),(yyvsp[(3) - (3)].expr)); }
+ break;
+
+ case 108:
+#line 532 "xkbparse.y"
+ { (yyval.expr)= (ExprDef *)AppendStmt(&(yyvsp[(1) - (3)].expr)->common,&(yyvsp[(3) - (3)].expr)->common); }
+ break;
+
+ case 109:
+#line 534 "xkbparse.y"
+ { (yyval.expr)= (yyvsp[(1) - (1)].expr); }
+ break;
+
+ case 110:
+#line 538 "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 548 "xkbparse.y"
+ { (yyval.doodad)= DoodadCreate((yyvsp[(1) - (6)].uval),(yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].var)); }
+ break;
+
+ case 112:
+#line 551 "xkbparse.y"
+ { (yyval.uval)= XkbTextDoodad; }
+ break;
+
+ case 113:
+#line 552 "xkbparse.y"
+ { (yyval.uval)= XkbOutlineDoodad; }
+ break;
+
+ case 114:
+#line 553 "xkbparse.y"
+ { (yyval.uval)= XkbSolidDoodad; }
+ break;
+
+ case 115:
+#line 554 "xkbparse.y"
+ { (yyval.uval)= XkbLogoDoodad; }
+ break;
+
+ case 116:
+#line 557 "xkbparse.y"
+ { (yyval.sval)= (yyvsp[(1) - (1)].sval); }
+ break;
+
+ case 117:
+#line 558 "xkbparse.y"
+ { (yyval.sval)= (yyvsp[(1) - (1)].sval); }
+ break;
+
+ case 118:
+#line 562 "xkbparse.y"
+ { (yyval.sval)= XkbInternAtom(NULL,"action",False); }
+ break;
+
+ case 119:
+#line 564 "xkbparse.y"
+ { (yyval.sval)= XkbInternAtom(NULL,"interpret",False); }
+ break;
+
+ case 120:
+#line 566 "xkbparse.y"
+ { (yyval.sval)= XkbInternAtom(NULL,"type",False); }
+ break;
+
+ case 121:
+#line 568 "xkbparse.y"
+ { (yyval.sval)= XkbInternAtom(NULL,"key",False); }
+ break;
+
+ case 122:
+#line 570 "xkbparse.y"
+ { (yyval.sval)= XkbInternAtom(NULL,"group",False); }
+ break;
+
+ case 123:
+#line 572 "xkbparse.y"
+ {(yyval.sval)=XkbInternAtom(NULL,"modifier_map",False);}
+ break;
+
+ case 124:
+#line 574 "xkbparse.y"
+ { (yyval.sval)= XkbInternAtom(NULL,"indicator",False); }
+ break;
+
+ case 125:
+#line 576 "xkbparse.y"
+ { (yyval.sval)= XkbInternAtom(NULL,"shape",False); }
+ break;
+
+ case 126:
+#line 578 "xkbparse.y"
+ { (yyval.sval)= XkbInternAtom(NULL,"row",False); }
+ break;
+
+ case 127:
+#line 580 "xkbparse.y"
+ { (yyval.sval)= XkbInternAtom(NULL,"section",False); }
+ break;
+
+ case 128:
+#line 582 "xkbparse.y"
+ { (yyval.sval)= XkbInternAtom(NULL,"text",False); }
+ break;
+
+ case 129:
+#line 585 "xkbparse.y"
+ { (yyval.uval)= (yyvsp[(1) - (1)].uval); }
+ break;
+
+ case 130:
+#line 586 "xkbparse.y"
+ { (yyval.uval)= MergeDefault; }
+ break;
+
+ case 131:
+#line 589 "xkbparse.y"
+ { (yyval.uval)= MergeDefault; }
+ break;
+
+ case 132:
+#line 590 "xkbparse.y"
+ { (yyval.uval)= MergeAugment; }
+ break;
+
+ case 133:
+#line 591 "xkbparse.y"
+ { (yyval.uval)= MergeOverride; }
+ break;
+
+ case 134:
+#line 592 "xkbparse.y"
+ { (yyval.uval)= MergeReplace; }
+ break;
+
+ case 135:
+#line 593 "xkbparse.y"
+ { (yyval.uval)= MergeAltForm; }
+ break;
+
+ case 136:
+#line 596 "xkbparse.y"
+ { (yyval.expr)= (yyvsp[(1) - (1)].expr); }
+ break;
+
+ case 137:
+#line 597 "xkbparse.y"
+ { (yyval.expr)= NULL; }
+ break;
+
+ case 138:
+#line 601 "xkbparse.y"
+ { (yyval.expr)= (ExprDef *)AppendStmt(&(yyvsp[(1) - (3)].expr)->common,&(yyvsp[(3) - (3)].expr)->common); }
+ break;
+
+ case 139:
+#line 603 "xkbparse.y"
+ { (yyval.expr)= (yyvsp[(1) - (1)].expr); }
+ break;
+
+ case 140:
+#line 607 "xkbparse.y"
+ { (yyval.expr)= ExprCreateBinary(OpDivide,(yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); }
+ break;
+
+ case 141:
+#line 609 "xkbparse.y"
+ { (yyval.expr)= ExprCreateBinary(OpAdd,(yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); }
+ break;
+
+ case 142:
+#line 611 "xkbparse.y"
+ { (yyval.expr)= ExprCreateBinary(OpSubtract,(yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); }
+ break;
+
+ case 143:
+#line 613 "xkbparse.y"
+ { (yyval.expr)= ExprCreateBinary(OpMultiply,(yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); }
+ break;
+
+ case 144:
+#line 615 "xkbparse.y"
+ { (yyval.expr)= ExprCreateBinary(OpAssign,(yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); }
+ break;
+
+ case 145:
+#line 617 "xkbparse.y"
+ { (yyval.expr)= (yyvsp[(1) - (1)].expr); }
+ break;
+
+ case 146:
+#line 621 "xkbparse.y"
+ { (yyval.expr)= ExprCreateUnary(OpNegate,(yyvsp[(2) - (2)].expr)->type,(yyvsp[(2) - (2)].expr)); }
+ break;
+
+ case 147:
+#line 623 "xkbparse.y"
+ { (yyval.expr)= ExprCreateUnary(OpUnaryPlus,(yyvsp[(2) - (2)].expr)->type,(yyvsp[(2) - (2)].expr)); }
+ break;
+
+ case 148:
+#line 625 "xkbparse.y"
+ { (yyval.expr)= ExprCreateUnary(OpNot,TypeBoolean,(yyvsp[(2) - (2)].expr)); }
+ break;
+
+ case 149:
+#line 627 "xkbparse.y"
+ { (yyval.expr)= ExprCreateUnary(OpInvert,(yyvsp[(2) - (2)].expr)->type,(yyvsp[(2) - (2)].expr)); }
+ break;
+
+ case 150:
+#line 629 "xkbparse.y"
+ { (yyval.expr)= (yyvsp[(1) - (1)].expr); }
+ break;
+
+ case 151:
+#line 631 "xkbparse.y"
+ { (yyval.expr)= ActionCreate((yyvsp[(1) - (4)].sval),(yyvsp[(3) - (4)].expr)); }
+ break;
+
+ case 152:
+#line 633 "xkbparse.y"
+ { (yyval.expr)= (yyvsp[(1) - (1)].expr); }
+ break;
+
+ case 153:
+#line 635 "xkbparse.y"
+ { (yyval.expr)= (yyvsp[(2) - (3)].expr); }
+ break;
+
+ case 154:
+#line 639 "xkbparse.y"
+ { (yyval.expr)= (ExprDef *)AppendStmt(&(yyvsp[(1) - (3)].expr)->common,&(yyvsp[(3) - (3)].expr)->common); }
+ break;
+
+ case 155:
+#line 641 "xkbparse.y"
+ { (yyval.expr)= (yyvsp[(1) - (1)].expr); }
+ break;
+
+ case 156:
+#line 645 "xkbparse.y"
+ { (yyval.expr)= ActionCreate((yyvsp[(1) - (4)].sval),(yyvsp[(3) - (4)].expr)); }
+ break;
+
+ case 157:
+#line 649 "xkbparse.y"
+ {
+ ExprDef *expr;
+ expr= ExprCreate(ExprIdent,TypeUnknown);
+ expr->value.str= (yyvsp[(1) - (1)].sval);
+ (yyval.expr)= expr;
+ }
+ break;
+
+ case 158:
+#line 656 "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 664 "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 673 "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 684 "xkbparse.y"
+ {
+ ExprDef *expr;
+ expr= ExprCreate(ExprValue,TypeString);
+ expr->value.str= (yyvsp[(1) - (1)].sval);
+ (yyval.expr)= expr;
+ }
+ break;
+
+ case 162:
+#line 691 "xkbparse.y"
+ {
+ ExprDef *expr;
+ expr= ExprCreate(ExprValue,TypeInt);
+ expr->value.ival= (yyvsp[(1) - (1)].ival);
+ (yyval.expr)= expr;
+ }
+ break;
+
+ case 163:
+#line 698 "xkbparse.y"
+ {
+ ExprDef *expr;
+ expr= ExprCreate(ExprValue,TypeFloat);
+ expr->value.ival= (yyvsp[(1) - (1)].ival);
+ (yyval.expr)= expr;
+ }
+ break;
+
+ case 164:
+#line 705 "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 715 "xkbparse.y"
+ { (yyval.expr)= (yyvsp[(1) - (1)].expr); }
+ break;
+
+ case 166:
+#line 716 "xkbparse.y"
+ { (yyval.expr)= NULL; }
+ break;
+
+ case 167:
+#line 720 "xkbparse.y"
+ { (yyval.expr)= AppendKeysymList((yyvsp[(1) - (3)].expr),(KeySym)(yyvsp[(3) - (3)].uval)); }
+ break;
+
+ case 168:
+#line 722 "xkbparse.y"
+ { (yyval.expr)= CreateKeysymList((KeySym)(yyvsp[(1) - (1)].uval)); }
+ break;
+
+ case 169:
+#line 726 "xkbparse.y"
+ {
+ KeySym sym;
+ if (LookupKeysym(scanStr,&sym))
+ (yyval.uval)= sym;
+ else {
+ char buf[120];
+ sprintf(buf,"expected keysym, got %s",
+ uStringText(scanStr));
+ yyerror(buf);
+ yynerrs++;
+ (yyval.uval)= NoSymbol;
+ }
+ }
+ break;
+
+ case 170:
+#line 740 "xkbparse.y"
+ {
+ (yyval.uval)= XK_section;
+ }
+ break;
+
+ case 171:
+#line 744 "xkbparse.y"
+ {
+ if ((yyvsp[(1) - (1)].ival)<10) (yyval.uval)= (yyvsp[(1) - (1)].ival)+'0'; /* XK_0 .. XK_9 */
+ else (yyval.uval)= (yyvsp[(1) - (1)].ival);
+ }
+ break;
+
+ case 172:
+#line 750 "xkbparse.y"
+ { (yyval.ival)= -(yyvsp[(2) - (2)].ival); }
+ break;
+
+ case 173:
+#line 751 "xkbparse.y"
+ { (yyval.ival)= (yyvsp[(1) - (1)].ival); }
+ break;
+
+ case 174:
+#line 754 "xkbparse.y"
+ { (yyval.ival)= scanInt; }
+ break;
+
+ case 175:
+#line 755 "xkbparse.y"
+ { (yyval.ival)= scanInt*XkbGeomPtsPerMM; }
+ break;
+
+ case 176:
+#line 758 "xkbparse.y"
+ { (yyval.ival)= scanInt; }
+ break;
+
+ case 177:
+#line 761 "xkbparse.y"
+ { (yyval.ival)= scanInt; }
+ break;
+
+ case 178:
+#line 764 "xkbparse.y"
+ { (yyval.str)= scanStr; scanStr= NULL; }
+ break;
+
+ case 179:
+#line 767 "xkbparse.y"
+ { (yyval.sval)= XkbInternAtom(NULL,scanStr,False); }
+ break;
+
+ case 180:
+#line 768 "xkbparse.y"
+ { (yyval.sval)= XkbInternAtom(NULL,"default",False); }
+ break;
+
+ case 181:
+#line 771 "xkbparse.y"
+ { (yyval.sval)= XkbInternAtom(NULL,scanStr,False); }
+ break;
+
+ case 182:
+#line 774 "xkbparse.y"
+ { (yyval.str)= (yyvsp[(1) - (1)].str); }
+ break;
+
+ case 183:
+#line 775 "xkbparse.y"
+ { (yyval.str)= NULL; }
+ break;
+
+ case 184:
+#line 778 "xkbparse.y"
+ { (yyval.str)= scanStr; scanStr= NULL; }
+ break;
+
+
+/* Line 1267 of yacc.c. */
+#line 2929 "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 780 "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 ((scanStr)&&(warningLevel>3))
+ (void)fprintf(stderr,"last scanned symbol is: %s\n",scanStr);
+ }
+ return;
+}
+
+
+int
+yywrap(void)
+{
+ return 1;
+}
+
+
diff --git a/xkbcomp/xkbparse.y b/xkbcomp/xkbparse.y
new file mode 100644
index 000000000..52afa2b80
--- /dev/null
+++ b/xkbcomp/xkbparse.y
@@ -0,0 +1,799 @@
+/* $Xorg: xkbparse.y,v 1.3 2000/08/17 19:54:34 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86: xc/programs/xkbcomp/xkbparse.y,v 3.11tsi Exp $ */
+
+%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>
+
+
+%}
+%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 KeySym
+%type <uval> DoodadType Flag Flags OptFlags
+%type <str> KeyName MapName OptMapName
+%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(scanStr,MergeDefault)->common;
+ }
+ else {
+ $$= &IncludeCreate(scanStr,$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((KeySym)$1,$3); }
+ | KeySym
+ { $$= InterpCreate((KeySym)$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,(KeySym)$3); }
+ | KeySym
+ { $$= CreateKeysymList((KeySym)$1); }
+ ;
+
+KeySym : IDENT
+ {
+ KeySym sym;
+ if (LookupKeysym(scanStr,&sym))
+ $$= sym;
+ else {
+ char buf[120];
+ sprintf(buf,"expected keysym, got %s",
+ uStringText(scanStr));
+ yyerror(buf);
+ yynerrs++;
+ $$= NoSymbol;
+ }
+ }
+ | SECTION
+ {
+ $$= XK_section;
+ }
+ | Integer
+ {
+ if ($1<10) $$= $1+'0'; /* XK_0 .. XK_9 */
+ else $$= $1;
+ }
+ ;
+
+SignedNumber : MINUS Number { $$= -$2; }
+ | Number { $$= $1; }
+ ;
+
+Number : FLOAT { $$= scanInt; }
+ | INTEGER { $$= scanInt*XkbGeomPtsPerMM; }
+ ;
+
+Float : FLOAT { $$= scanInt; }
+ ;
+
+Integer : INTEGER { $$= scanInt; }
+ ;
+
+KeyName : KEYNAME { $$= scanStr; scanStr= NULL; }
+ ;
+
+Ident : IDENT { $$= XkbInternAtom(NULL,scanStr,False); }
+ | DEFAULT { $$= XkbInternAtom(NULL,"default",False); }
+ ;
+
+String : STRING { $$= XkbInternAtom(NULL,scanStr,False); }
+ ;
+
+OptMapName : MapName { $$= $1; }
+ | { $$= NULL; }
+ ;
+
+MapName : STRING { $$= scanStr; scanStr= NULL; }
+ ;
+%%
+void
+yyerror(const char *s)
+{
+ if (warningLevel>0) {
+ (void)fprintf(stderr,"%s: line %d of %s\n",s,lineNum,
+ (scanFile?scanFile:"(unknown)"));
+ if ((scanStr)&&(warningLevel>3))
+ (void)fprintf(stderr,"last scanned symbol is: %s\n",scanStr);
+ }
+ return;
+}
+
+
+int
+yywrap(void)
+{
+ return 1;
+}
+
diff --git a/xkbcomp/xkbpath.c b/xkbcomp/xkbpath.c
new file mode 100644
index 000000000..0a7329c8e
--- /dev/null
+++ b/xkbcomp/xkbpath.c
@@ -0,0 +1,322 @@
+/* $Xorg: xkbpath.c,v 1.3 2000/08/17 19:54:34 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86: xc/programs/xkbcomp/xkbpath.c,v 3.7 2002/06/05 00:00:38 dawes Exp $ */
+
+#include <X11/Xlib.h>
+#include <X11/XKBlib.h>
+
+#define DEBUG_VAR_NOT_LOCAL
+#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
+
+static Bool noDefaultPath = False;
+static int longestPath;
+static int szPath;
+static int nPathEntries;
+static char ** includePath;
+
+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 {
+ next= strpbrk(str,"|+");
+ if (next) {
+ *nextop_rtrn= *next;
+ *next++= '\0';
+ }
+ else {
+ *nextop_rtrn= '\0';
+ next= NULL;
+ }
+ 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;
+}
+
+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);
+}
+
+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;
+ longestPath= 0;
+ }
+ noDefaultPath = True;
+ return;
+}
+
+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 (len>longestPath)
+ longestPath= len;
+ 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;
+}
+
+/***====================================================================***/
+
+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;
+
+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;
+}
+
+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;
+}
+
+/***====================================================================***/
+
+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;
+ }
+ sprintf(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/xkbcomp/xkbpath.h b/xkbcomp/xkbpath.h
new file mode 100644
index 000000000..75c137d0c
--- /dev/null
+++ b/xkbcomp/xkbpath.h
@@ -0,0 +1,79 @@
+/* $XConsortium $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86: xc/programs/xkbcomp/xkbpath.h,v 1.3 2002/07/01 02:26:01 tsi Exp $ */
+
+#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/xkbcomp/xkbscan.c b/xkbcomp/xkbscan.c
new file mode 100644
index 000000000..ef2227d79
--- /dev/null
+++ b/xkbcomp/xkbscan.c
@@ -0,0 +1,468 @@
+/* $Xorg: xkbscan.c,v 1.3 2000/08/17 19:54:34 cpqbld Exp $ */
+/************************************************************
+ 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.
+
+ ********************************************************/
+/* $XFree86: xc/programs/xkbcomp/xkbscan.c,v 3.10 2001/01/17 23:45:45 dawes Exp $ */
+
+#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"
+
+FILE *yyin = NULL;
+
+static char scanFileBuf[1024];
+char * scanFile= scanFileBuf;
+int lineNum= 0;
+
+int scanInt;
+char *scanIntStr;
+int scanIntClass;
+
+char *scanStr = NULL;
+int scanStrLine= 0;
+
+#define BUFSIZE 512
+static int nInBuf = 0;
+static char buf[BUFSIZE];
+
+#ifdef DEBUG
+
+extern unsigned debugFlags;
+
+static char *
+tokText(int tok)
+{
+static char buf[32];
+
+ switch (tok) {
+ case END_OF_FILE: sprintf(buf, "END_OF_FILE");break;
+ case ERROR_TOK: sprintf(buf, "ERROR"); break;
+
+ case XKB_KEYMAP: sprintf(buf, "XKB_KEYMAP"); break;
+ case XKB_KEYCODES: sprintf(buf, "XKB_KEYCODES"); break;
+ case XKB_TYPES: sprintf(buf, "XKB_TYPES"); break;
+ case XKB_SYMBOLS: sprintf(buf, "XKB_SYMBOLS"); break;
+ case XKB_COMPATMAP: sprintf(buf, "XKB_COMPATMAP"); break;
+ case XKB_GEOMETRY: sprintf(buf, "XKB_GEOMETRY"); break;
+ case XKB_SEMANTICS: sprintf(buf, "XKB_SEMANTICS"); break;
+ case XKB_LAYOUT: sprintf(buf, "XKB_LAYOUT"); break;
+
+ case INCLUDE: sprintf(buf, "INCLUDE"); break;
+ case OVERRIDE: sprintf(buf, "OVERRIDE"); break;
+ case AUGMENT: sprintf(buf, "AUGMENT"); break;
+ case REPLACE: sprintf(buf, "REPLACE"); break;
+ case ALTERNATE: sprintf(buf, "ALTERNATE"); break;
+
+ case VIRTUAL_MODS: sprintf(buf, "VIRTUAL_MODS"); break;
+ case TYPE: sprintf(buf, "TYPE"); break;
+ case INTERPRET: sprintf(buf, "INTERPRET"); break;
+ case ACTION_TOK: sprintf(buf, "ACTION"); break;
+ case KEY: sprintf(buf, "KEY"); break;
+ case ALIAS: sprintf(buf, "ALIAS"); break;
+ case GROUP: sprintf(buf, "GROUP"); break;
+ case MODIFIER_MAP: sprintf(buf, "MODIFIER_MAP"); break;
+ case INDICATOR: sprintf(buf, "INDICATOR"); break;
+ case SHAPE: sprintf(buf, "SHAPE"); break;
+ case KEYS: sprintf(buf, "KEYS"); break;
+ case ROW: sprintf(buf, "ROW"); break;
+ case SECTION: sprintf(buf, "SECTION"); break;
+ case OVERLAY: sprintf(buf, "OVERLAY"); break;
+ case TEXT: sprintf(buf, "TEXT"); break;
+ case OUTLINE: sprintf(buf, "OUTLINE"); break;
+ case SOLID: sprintf(buf, "SOLID"); break;
+ case LOGO: sprintf(buf, "LOGO"); break;
+ case VIRTUAL: sprintf(buf, "VIRTUAL"); break;
+
+ case EQUALS: sprintf(buf, "EQUALS"); break;
+ case PLUS: sprintf(buf, "PLUS"); break;
+ case MINUS: sprintf(buf, "MINUS"); break;
+ case DIVIDE: sprintf(buf, "DIVIDE"); break;
+ case TIMES: sprintf(buf, "TIMES"); break;
+ case OBRACE: sprintf(buf, "OBRACE"); break;
+ case CBRACE: sprintf(buf, "CBRACE"); break;
+ case OPAREN: sprintf(buf, "OPAREN"); break;
+ case CPAREN: sprintf(buf, "CPAREN"); break;
+ case OBRACKET: sprintf(buf, "OBRACKET");break;
+ case CBRACKET: sprintf(buf, "CBRACKET");break;
+ case DOT: sprintf(buf, "DOT"); break;
+ case COMMA: sprintf(buf, "COMMA"); break;
+ case SEMI: sprintf(buf, "SEMI"); break;
+ case EXCLAM: sprintf(buf, "EXCLAM"); break;
+ case INVERT: sprintf(buf, "INVERT"); break;
+
+ case STRING: sprintf(buf, "STRING (%s)",scanStr); break;
+ case INTEGER: sprintf(buf, "INTEGER (0x%x)",scanInt); break;
+ case FLOAT: sprintf(buf, "FLOAT (%d.%d)",
+ scanInt/XkbGeomPtsPerMM,
+ scanInt%XkbGeomPtsPerMM);break;
+ case IDENT: sprintf(buf, "IDENT (%s)",scanStr); break;
+ case KEYNAME: sprintf(buf, "KEYNAME (%s)",scanStr); break;
+
+ case PARTIAL: sprintf(buf, "PARTIAL"); break;
+ case DEFAULT: sprintf(buf, "DEFAULT"); break;
+ case HIDDEN: sprintf(buf, "HIDDEN"); break;
+
+ case ALPHANUMERIC_KEYS: sprintf(buf, "ALPHANUMERIC_KEYS"); break;
+ case MODIFIER_KEYS: sprintf(buf, "MODIFIER_KEYS"); break;
+ case KEYPAD_KEYS: sprintf(buf, "KEYPAD_KEYS"); break;
+ case FUNCTION_KEYS: sprintf(buf, "FUNCTION_KEYS"); break;
+ case ALTERNATE_GROUP: sprintf(buf, "ALTERNATE_GROUP"); break;
+
+ default: sprintf(buf, "UNKNOWN"); break;
+ }
+ return buf;
+}
+#endif
+
+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;
+
+ nInBuf = 0;
+ while ( ((ch=getc(yyin))!=EOF) && (ch!='"') ) {
+ if ( ch == '\\' ) {
+ if ((ch = getc(yyin))!=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=getc(yyin))!=EOF) && (isdigit(tmp)) &&
+ (tmp!='8') && (tmp!='9')) {
+ ch= (ch*8)+(tmp-'0');
+ }
+ else {
+ stop= 1;
+ ungetc(tmp,yyin);
+ }
+ if (!stop) {
+ if (((tmp=getc(yyin))!=EOF) && (isdigit(tmp)) &&
+ (tmp!='8') && (tmp!='9')) {
+ ch= (ch*8)+(tmp-'0');
+ }
+ else {
+ stop= 1;
+ ungetc(tmp,yyin);
+ }
+ }
+ if (!stop) {
+ if (((tmp=getc(yyin))!=EOF) && (isdigit(tmp)) &&
+ (tmp!='8') && (tmp!='9')) {
+ ch= (ch*8)+(tmp-'0');
+ }
+ else {
+ stop= 1;
+ ungetc(tmp,yyin);
+ }
+ }
+ }
+ }
+ else return ERROR_TOK;
+ }
+ if ( nInBuf < BUFSIZE-1 )
+ buf[nInBuf++] = ch;
+ }
+ if ( ch == '"' ) {
+ buf[nInBuf++] = '\0';
+ if ( scanStr )
+ uFree( scanStr );
+ scanStr = (char *)uStringDup(buf);
+ scanStrLine = lineNum;
+ return STRING;
+ }
+ return ERROR_TOK;
+}
+
+static int
+yyGetKeyName(void)
+{
+int ch;
+
+ nInBuf = 0;
+ while ( ((ch=getc(yyin))!=EOF) && (ch!='>') ) {
+ if ( ch == '\\' ) {
+ if ((ch = getc(yyin))!=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=getc(yyin))!=EOF) && (isdigit(tmp)) &&
+ (tmp!='8') && (tmp!='9')) {
+ ch= (ch*8)+(tmp-'0');
+ }
+ else {
+ stop= 1;
+ ungetc(tmp,yyin);
+ }
+ if ((!stop) && ((tmp=getc(yyin))!=EOF) && (isdigit(tmp)) &&
+ (tmp!='8') && (tmp!='9')) {
+ ch= (ch*8)+(tmp-'0');
+ }
+ else {
+ stop= 1;
+ ungetc(tmp,yyin);
+ }
+ if ((!stop) && ((tmp=getc(yyin))!=EOF) && (isdigit(tmp)) &&
+ (tmp!='8') && (tmp!='9')) {
+ ch= (ch*8)+(tmp-'0');
+ }
+ else {
+ stop= 1;
+ ungetc(tmp,yyin);
+ }
+ }
+ }
+ else return ERROR_TOK;
+ }
+
+ if ( nInBuf < BUFSIZE-1 )
+ buf[nInBuf++] = ch;
+ }
+ if (( ch == '>' )&&(nInBuf<5)) {
+ buf[nInBuf++] = '\0';
+ if ( scanStr )
+ uFree( scanStr );
+ scanStr = (char *)uStringDup(buf);
+ scanStrLine = lineNum;
+ return KEYNAME;
+ }
+ return ERROR_TOK;
+}
+
+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 }
+};
+int numKeywords = sizeof(keywords)/sizeof(struct _Keyword);
+
+static int
+yyGetIdent(int first)
+{
+int ch,i,found;
+int rtrn = IDENT;
+
+ buf[0] = first; nInBuf = 1;
+ while ( ((ch=getc(yyin))!=EOF) && (isalnum(ch)||(ch=='_')) ) {
+ if ( nInBuf < BUFSIZE - 1 )
+ buf[nInBuf++] = ch;
+ }
+ buf[nInBuf++] = '\0';
+ found= 0;
+
+ for (i=0;(!found)&&(i<numKeywords);i++) {
+ if (uStrCaseCmp(buf,keywords[i].keyword)==0) {
+ rtrn= keywords[i].token;
+ found= 1;
+ }
+ }
+ if (!found) {
+ if ( scanStr )
+ uFree( scanStr );
+ scanStr = (char *)uStringDup(buf);
+ scanStrLine = lineNum;
+ rtrn = IDENT;
+ }
+
+ if ( (ch!=EOF) && (!isspace(ch)) )
+ ungetc( ch, yyin );
+ else if ( ch=='\n' )
+ lineNum++;
+
+ return rtrn;
+}
+
+static int
+yyGetNumber(int ch)
+{
+int isFloat= 0;
+
+ buf[0]= ch;
+ nInBuf= 1;
+ while (((ch=getc(yyin))!=EOF)&&(isxdigit(ch)||((nInBuf==1)&&(ch=='x')))) {
+ buf[nInBuf++]= ch;
+ }
+ if (ch=='.') {
+ isFloat= 1;
+ buf[nInBuf++]= ch;
+ while (((ch=getc(yyin))!=EOF)&&(isxdigit(ch))) {
+ buf[nInBuf++]= ch;
+ }
+ }
+ buf[nInBuf++]= '\0';
+ if ((ch!=EOF)&&(!isspace(ch)))
+ ungetc( ch, yyin );
+
+ 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 = getc(yyin);
+ if ( ch == '\n' ) {
+ lineNum++;
+ }
+ else if ( ch=='#' ) { /* handle shell style '#' comments */
+ do {
+ ch= getc(yyin);
+ } while ((ch!='\n')&&(ch!=EOF));
+ lineNum++;
+ }
+ else if ( ch=='/' ) { /* handle C++ style double-/ comments */
+ int newch= getc(yyin);
+ if (newch=='/') {
+ do {
+ ch= getc(yyin);
+ } while ((ch!='\n')&&(ch!=EOF));
+ lineNum++;
+ }
+ else if (newch!=EOF) {
+ ungetc(newch,yyin);
+ }
+ }
+ } 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/xkbcomp/ylwrap b/xkbcomp/ylwrap
new file mode 100644
index 000000000..7278b6a35
--- /dev/null
+++ b/xkbcomp/ylwrap
@@ -0,0 +1,223 @@
+#! /bin/sh
+# ylwrap - wrapper for lex/yacc invocations.
+
+scriptversion=2007-11-22.22
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005,
+# 2007 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, 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.
+
+# 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-end: "$"
+# End: