diff options
author | Alexandr Shadchin <shadchin@cvs.openbsd.org> | 2011-01-11 20:56:41 +0000 |
---|---|---|
committer | Alexandr Shadchin <shadchin@cvs.openbsd.org> | 2011-01-11 20:56:41 +0000 |
commit | 9ac5a1302296cc63925671b566af8c4618cb581e (patch) | |
tree | a57d391645c4a3c5b6f756bae61bd7c2fe25009f /app/xkbcomp | |
parent | e7e24b28c0e0b96461d93395184a8a34f10631ca (diff) |
Update to xkbcomp 1.2.0.
ok matthieu@
Diffstat (limited to 'app/xkbcomp')
46 files changed, 20775 insertions, 15152 deletions
diff --git a/app/xkbcomp/AUTHORS b/app/xkbcomp/AUTHORS deleted file mode 100644 index e69de29bb..000000000 --- a/app/xkbcomp/AUTHORS +++ /dev/null diff --git a/app/xkbcomp/ChangeLog b/app/xkbcomp/ChangeLog index 6bc06a804..f1b325f85 100644 --- a/app/xkbcomp/ChangeLog +++ b/app/xkbcomp/ChangeLog @@ -1,3 +1,477 @@ +commit 851a5f6e0c1b2a98d4714d95e40198ab5dc61607 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Sat Oct 30 09:59:52 2010 -0700 + + xkbcomp 1.2.0 + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit 87576c9ebf0f28d66833bb28a8199df1aa01f693 +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Thu Sep 23 20:29:57 2010 -0700 + + config: Remove unnecessary calls from configure.ac + + AC_PROG_CC & AC_PROG_INSTALL are provided by XORG_DEFAULT_OPTIONS now + PKG_CONFIG_MODULES handles AC_SUBST of the CFLAGS & LIBS variables + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit d083293a4e227e9dd27f74cde391fde4c5824b0c +Author: Alan Coopersmith <alan.coopersmith@oracle.com> +Date: Thu Sep 23 20:29:14 2010 -0700 + + config: upgrade to util-macros 1.8 for additional man page support + + Use MAN_SUBST now supplied in XORG_MANPAGE_SECTIONS + The value of MAN_SUBST is the same for all X.Org packages. + + Use AC_PROG_SED now supplied by XORG_DEFAULT_OPTIONS + The existing statement can now be removed from the configuration file. + + Use automake provided $(AM_V_GEN) and XORG_DEFAULT_OPTIONS provided $(SED) + Enables silent rule and use platform appropriate version of sed. + + Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> + +commit 8f13f1af68fc55b7567a4eb4462a0c911722a3c4 +Author: Gaetan Nadon <memsize@videotron.ca> +Date: Tue Jul 20 18:45:18 2010 -0400 + + config: update AC_PREREQ statement to 2.60 + + Unrelated to the previous patches, the new value simply reflects + the reality that the minimum level for autoconf to configure + all x.org modules is 2.60 dated June 2006. + + ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.60.tar.gz + + Signed-off-by: Gaetan Nadon <memsize@videotron.ca> + +commit 988eb0e121c0f2c992031002acb7274c2026764b +Author: Gaetan Nadon <memsize@videotron.ca> +Date: Mon Jul 12 10:53:34 2010 +0100 + + config: allow to build tarball when yacc is missing + + Autoconf does not handle this scenario as well as Automake does. + If xkbparse.c is already there, do not abort the configuration + if yacc is missing as it is not needed. + + If both xkbparse.c and yacc are missing, abort configuration. + Yacc is a required tool to build the package. + + Reported-by: Julien Cristau <jcristau@debian.org> + Signed-off-by: Gaetan Nadon <memsize@videotron.ca> + Signed-off-by: Daniel Stone <daniel@fooishbar.org> + +commit 446d226f85433aeb45834b65f966397ad6fbb17f +Author: Daniel Stone <daniel@fooishbar.org> +Date: Mon Jul 12 10:37:49 2010 +0100 + + limits.h is mandated by C89, no need to check for it + + Alan Coopersmith pointed out that C89 mandates limits.h, so for once in + X's life, checking for a system header is just being unnecessarily + paranoid. + + Signed-off-by: Daniel Stone <daniel@fooishbar.org> + +commit 61b3d4b024d8146cb0e7659aa958045ceb72c482 +Author: Julien Cristau <jcristau@debian.org> +Date: Mon Jul 12 10:28:32 2010 +0100 + + Fix signedness issue with getc() return value + + getc() and ungetc() return and take, respectively, an int rather than a + char to allow for error values as well. Oops. + + Signed-off-by: Daniel Stone <daniel@fooishbar.org> + +commit a281386fa887e6bf4110840779aed46dd0ac89b6 +Author: Daniel Stone <daniel@fooishbar.org> +Date: Fri Jul 9 19:34:29 2010 +0100 + + Fix parsing of 0x1a2b3c4d-style symbols + + Raw keysyms were not getting parsed correctly, due to forgetting to add + the code to libX11, forgetting to add the backwards-compat code for old + libX11s, and then stuffing the lexing up anyway. Yeesh. + + Signed-off-by: Daniel Stone <daniel@fooishbar.org> + +commit 0b04ecbb7a6afb223c91d3b15baab0bc48542281 +Author: Daniel Stone <daniel@fooishbar.org> +Date: Tue Jun 15 19:26:19 2010 +0100 + + Fix gcc warnings + + It was right too: printf was being misused in some spots. + + Signed-off-by: Daniel Stone <daniel@fooishbar.org> + +commit 41b0857c8c1179b87a26888588cbfff28f8bb0d6 +Author: Daniel Stone <daniel@fooishbar.org> +Date: Tue Jun 8 15:11:19 2010 +0100 + + Don't malloc() and free() most scanned symbols + + Use a constant buffer. Sigh. + + Signed-off-by: Daniel Stone <daniel@fooishbar.org> + +commit 7f7a57c75beb5e1dfb53351e490ef00a324b2727 +Author: Daniel Stone <daniel@fooishbar.org> +Date: Tue Jun 8 12:14:00 2010 +0100 + + Fix compilation with DEBUG + + Signed-off-by: Daniel Stone <daniel@fooishbar.org> + +commit 9887842e33174a6e98675b912e419c711dd20c0f +Author: Daniel Stone <daniel@fooishbar.org> +Date: Mon Jun 7 22:45:13 2010 +0100 + + Use fread() instead of getc() + + So, it turns out that if you're parsing a fairly large amount of data, + using getc() to get all the input rather than, say, read(), is some kind + of remarkably daft and unperformant idea. + + Signed-off-by: Daniel Stone <daniel@fooishbar.org> + +commit 02de53d767b20bab1517b4e8a3e7eb3b9e7f15be +Author: Daniel Stone <daniel@fooishbar.org> +Date: Mon Jun 7 22:43:01 2010 +0100 + + Lazy keysym parsing (avoid XStringToKeysym) + + Instead of calling XStringToKeysym on every keysym we parse, store it as + a string until we need to store it in an actual keymap. + + Signed-off-by: Daniel Stone <daniel@fooishbar.org> + +commit 07cc4d60dea2b4c947fed45b082edae4a53b186a +Author: Gaetan Nadon <memsize@videotron.ca> +Date: Wed Jun 2 15:23:58 2010 -0400 + + config: add check for yacc to insure it is installed #27973 + + Unlike other macros AC_PROG_YACC sets the YACC variable to "yacc" + as a last resort, even if no programs have been found. Improve error + checking by issuing an error message if yacc is not found. The module + cannot build anyway. + + Reported-by: Peter Hutterer <peter.hutterer@who-t.net> + Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> + Signed-off-by: Gaetan Nadon <memsize@videotron.ca> + +commit 7888738047e9f1545aa1905b4a2a0654686f49a8 +Author: Gaetan Nadon <memsize@videotron.ca> +Date: Thu Feb 11 10:08:07 2010 -0500 + + config: move CWARNFLAGS from configure.ac to Makefile.am + + Compiler warning flags should be explicitly set in the makefile + rather than being merged with other packages compiler flags. + + Signed-off-by: Gaetan Nadon <memsize@videotron.ca> + +commit ba906359da32644b40b3a8a71e77d3cabca56efe +Author: Gaetan Nadon <memsize@videotron.ca> +Date: Thu Nov 26 09:19:54 2009 -0500 + + Makefile.am: add ChangeLog and INSTALL on MAINTAINERCLEANFILES + + Now that the INSTALL file is generated. + Allows running make maintainer-clean. + +commit 667f0a0e5d3143533cbbe5979ef82c13cfa62c3a +Author: Gaetan Nadon <memsize@videotron.ca> +Date: Wed Oct 28 14:09:08 2009 -0400 + + INSTALL, NEWS, README or AUTHORS files are missing/incorrect #24206 + + Add missing INSTALL file. Use standard GNU file on building tarball + README may have been updated + Remove AUTHORS file as it is empty and no content available yet. + Remove NEWS file as it is empty and no content available yet. + +commit 4b7c8a8ef337614c831b2555afeb6d89dbc14fb1 +Author: Gaetan Nadon <memsize@videotron.ca> +Date: Tue Oct 27 15:07:25 2009 -0400 + + Deploy the new XORG_DEFAULT_OPTIONS #24242 + + This macro aggregate a number of existing macros that sets commmon + X.Org components configuration options. It shields the configuration file from + future changes. + +commit 5fa9ef7e5e87f875dd92cc33403cebf6c60c557f +Author: Gaetan Nadon <memsize@videotron.ca> +Date: Mon Oct 26 22:08:39 2009 -0400 + + Makefile.am: ChangeLog not required: EXTRA_DIST or *CLEANFILES #24432 + + ChangeLog filename is known to Automake and requires no further + coding in the makefile. + +commit b3a52787e0dad42ea7e8da26926b9533b1ecab84 +Author: Gaetan Nadon <memsize@videotron.ca> +Date: Thu Oct 22 12:34:15 2009 -0400 + + .gitignore: use common defaults with custom section # 24239 + + Using common defaults will reduce errors and maintenance. + Only the very small or inexistent custom section need periodic maintenance + when the structure of the component changes. Do not edit defaults. + +commit fa7e3ff7b49f76294aa14aa8bf1b8adbceb5d340 +Author: Jeremy Huddleston <jeremyhu@freedesktop.org> +Date: Wed Oct 21 12:47:21 2009 -0700 + + This is not a GNU project, so declare it foreign. + + On Wed, 2009-10-21 at 13:36 +1000, Peter Hutterer wrote: + > On Tue, Oct 20, 2009 at 08:23:55PM -0700, Jeremy Huddleston wrote: + > > I noticed an INSTALL file in xlsclients and libXvMC today, and it + > > was quite annoying to work around since 'autoreconf -fvi' replaces + > > it and git wants to commit it. Should these files even be in git? + > > Can I nuke them for the betterment of humanity and since they get + > > created by autoreconf anyways? + > + > See https://bugs.freedesktop.org/show_bug.cgi?id=24206 + + As an interim measure, replace AM_INIT_AUTOMAKE([dist-bzip2]) with + AM_INIT_AUTOMAKE([foreign dist-bzip2]). This will prevent the generation + of the INSTALL file. It is also part of the 24206 solution. + + Signed-off-by: Jeremy Huddleston <jeremyhu@freedesktop.org> + +commit a5160032d7e46473b8702b87a546071fc0c0978c +Author: Peter Hutterer <peter.hutterer@who-t.net> +Date: Sat Oct 3 21:12:47 2009 +1000 + + xkbcomp 1.1.1 + + Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> + +commit a36ca5ba61e2b97398a79713922644fee1a263d1 +Author: Rami Ylimaki <ext-rami.ylimaki@nokia.com> +Date: Wed Aug 5 17:16:16 2009 +0300 + + xkbcomp: Remove output file if closing fails. + + Without the fix xkbcomp may leave a truncated file in the filesystem + if there is not enough disk space. Using the truncated file leads to + problems. + + Signed-off-by: Rami Ylimaki <ext-rami.ylimaki@nokia.com> + Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> + +commit 2cc1dc9a327a5100043d3d54e899b98b81cdf5f5 +Author: Peter Hutterer <peter.hutterer@who-t.net> +Date: Thu Jul 9 08:34:21 2009 +1000 + + Bump to 1.1.0. + +commit eeaa4aec798ef045d0b3b9de3c25932b85b9ac3d +Author: Alan Coopersmith <alan.coopersmith@sun.com> +Date: Mon May 11 09:39:03 2009 -0700 + + Use temporary buffer for generating Uxxx names to avoid overflow + + Instead of sprintf()'ing a 4 character string to a char [4] buffer, + and leaving the trailing '\0' to overwrite into the next entry, + snprintf() to a 5 character temp buffer and memcpy the 4 characters + to the right place. + + Fixes parfait errors: + Error: Buffer overflow at xkbcomp-1.0.4/misc.c:393 + in function 'ComputeKbdDefaults' [Standard C Library pattern matching] + In sprintf related dereference of xkb->names->keys[i].name + with index not less than '4' + Destination array size is 4 bytes, data to be written is 4 bytes + Error: Buffer overflow at xkbcomp-1.0.4/misc.c:402 + in function 'ComputeKbdDefaults' [Standard C Library pattern matching] + In sprintf related dereference of xkb->names->keys[i].name + with index not less than '4' + Destination array size is 4 bytes, data to be written is 4 bytes + + [This bug was found by the Parfait bug checking tool. + For more information see http://research.sun.com/projects/parfait ] + + Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com> + +commit 2fd42dae8840089727f95211abdb86316e566afd +Author: Dan Nicholson <dbn.lists@gmail.com> +Date: Sat Mar 7 16:36:51 2009 -0800 + + Allow the default XKB config root to be set from configure + + The default was hardcoded in the Makefile as $(datadir)/share/X11/xkb. + This could cause a problem if you are installing xkbcomp to an alternate + location but want to continue using the system's XKB data. + + Signed-off-by: Dan Nicholson <dbn.lists@gmail.com> + +commit 3b816fe819bd849acdbabcfba769041bd3eab753 +Author: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br> +Date: Thu Jan 22 02:45:20 2009 -0200 + + Correct a remaining of a wrong change to make some DEBUG_VAR's static. + +commit f099da35386cf63d4935ba2613409ff28b3d7ea5 +Author: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br> +Date: Wed Jan 21 20:43:28 2009 -0200 + + Correct make distcheck and most gcc and sparse warnings. + + Remaining warnings are due to macros that check address or vectors + on the stack and auto generated yacc code. + + Compiled with default flags and also as: + % make CFLAGS=-DENTRY_TRACKING_ON -DDEBUG_ON -DASSERTIONS_ON + to ensure the "simplification" of code like: + foo.c: + <hash>define DEBUG_VAR foo_VAR + <hash>include "foo.h" + ... + foo.h: + <hash>ifdef DEBUG_VAR_NOT_LOCAL + extern + <hash>endif + int DEBUG_VAR; + ... + did not change the author's "intended" logic. + +commit 82cebb165b22d5409c9d4d31554a8da0c867e0d3 +Author: Peter Hutterer <peter.hutterer@redhat.com> +Date: Wed Sep 10 17:48:29 2008 +0930 + + Check for NULL strings before calling strdup. + + Signed-off-by: Peter Hutterer <peter.hutterer@redhat.com> + +commit a82e1dcc8ad095581402d05e5d1ae1bbf3646954 +Author: Alan Coopersmith <alan.coopersmith@sun.com> +Date: Fri Sep 5 15:07:13 2008 -0700 + + sprintf -> snprintf conversions + +commit d2d06305e1834548edd8a647564efa222a511b53 +Author: Alan Coopersmith <alan.coopersmith@sun.com> +Date: Fri Sep 5 14:44:51 2008 -0700 + + Remove #if 0'd typedef that appears nowhere else. + +commit acd277d7fd48ccfd8ef2ca052b4e144ee95a5d94 +Author: Alan Coopersmith <alan.coopersmith@sun.com> +Date: Fri Sep 5 14:32:15 2008 -0700 + + Remove X_NOT_POSIX #ifdefs + + POSIX.1-1990 is well below the current minimum bar + +commit 37b62a26716d3abf2ae07dd88cf54bc04d980bd8 +Author: Alan Coopersmith <alan.coopersmith@sun.com> +Date: Fri Sep 5 14:22:33 2008 -0700 + + Check for strdup & strcasecmp before assuming we need to provide our own + +commit 36fecff588199a3a6c007f09ff709f3148d40f77 +Author: Peter Hutterer <peter.hutterer@redhat.com> +Date: Tue Aug 19 16:33:03 2008 +0930 + + Don't overwrite previously assigned type indices with useless ones. + + The default type for a key with no levels is ONE_LEVEL. + Let's not overwrite the kt_index with this default type if we have previously + assigned a real type. + + Reproduceable by running setxkbmap -layout "ru(phonetic),us", the first group + is assigned ONE_LEVEL and shift stops working. + + Red Hat Bug #436626 <https://bugzilla.redhat.com/show_bug.cgi?id=436626> + +commit d0dfd26e81aef53e9adf5fd6372d69e2ac7a8f9c +Author: Peter Hutterer <peter.hutterer@redhat.com> +Date: Tue Aug 19 14:36:13 2008 +0930 + + Remove unused merge parameter from HandleKeyNameVar. + +commit 391ea45b2cadc7faeb6acb5d9ec7b405d67d46fd +Author: Peter Hutterer <peter.hutterer@redhat.com> +Date: Tue Aug 19 14:35:39 2008 +0930 + + Don't pass useless handlers around in HandleIncludeKeycodes. + + What use is a handler if we only ever use one function anyway? + +commit f05f20fd203afdadbcd571023ed31638ccda1f88 +Author: Peter Hutterer <peter.hutterer@redhat.com> +Date: Thu Aug 21 17:28:22 2008 +0930 + + More comments. + +commit 1aad2a5d8ede9fe5212a4e6087fbe34aa170ac54 +Author: Peter Hutterer <peter.hutterer@redhat.com> +Date: Mon Aug 18 16:28:44 2008 +0930 + + Remove useless longestPath variable. + +commit 7aef93914e1d6446f64aa42eafa18375c2cb4bed +Author: Peter Hutterer <peter.hutterer@redhat.com> +Date: Mon Aug 18 14:05:33 2008 +0930 + + Silence valgrind warnings. + + "Conditional jump or move depends on uninitialised value(s)" + +commit eb18e9176841b3ea64c497f1919686e134713eb6 +Author: Peter Hutterer <peter.hutterer@redhat.com> +Date: Mon Aug 11 18:01:48 2008 +0930 + + Add some explanatory comments + +commit 9b877d83947708259252275e14f6995dcf7c29ce +Author: Peter Hutterer <peter.hutterer@redhat.com> +Date: Mon Aug 11 16:20:22 2008 +0930 + + If we're not using XkbDesc, don't require it as a parameter. + +commit ca32570cf16494fb8e0577de8b05ba18cb927ce1 +Author: Peter Hutterer <peter.hutterer@redhat.com> +Date: Mon Aug 11 15:47:09 2008 +0930 + + Indent fixes. + + indent -cbi 0 -nprs -nut -npcs -i4 -bli 0 *.c *.h + +commit 12e8f5e5b3f33dbd1290c76dd0d6a4cf832993d7 +Author: Peter Hutterer <peter.hutterer@redhat.com> +Date: Mon Aug 11 15:40:03 2008 +0930 + + Add a few explanatory comments. + +commit de48206e7fe2206542313a2d1d1ea3c40b06114b +Author: Peter Hutterer <peter.hutterer@redhat.com> +Date: Mon Aug 11 15:14:31 2008 +0930 + + Remove RCS tags. + +commit 8eb2e1fcd08a05f296a31dbadde1ec3cc84d8e28 +Author: Matthieu Herrb <matthieu.herrb@laas.fr> +Date: Mon May 12 23:25:47 2008 +0200 + + Minimal man page addition for new -i option. + +commit 12df85eb5b08d5fb815b0965714f120b05c6c670 +Author: Daniel Stone <daniel@fooishbar.org> +Date: Fri May 9 21:09:44 2008 +0300 + + Bump to 1.0.5 + commit 1aecdffaa0db7bbf85bc0aae9043e9437b25c30d Author: Daniel Stone <daniel@fooishbar.org> Date: Thu Apr 17 00:52:29 2008 +0300 diff --git a/app/xkbcomp/INSTALL b/app/xkbcomp/INSTALL index 23e5f25d0..8b82ade08 100644 --- a/app/xkbcomp/INSTALL +++ b/app/xkbcomp/INSTALL @@ -1,16 +1,19 @@ Installation Instructions ************************* -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free -Software Foundation, Inc. +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006, 2007, 2008 Free Software Foundation, Inc. -This file is free documentation; the Free Software Foundation gives + This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== -These are generic installation instructions. + Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses @@ -23,9 +26,9 @@ debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. (Caching is +the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale -cache files.) +cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail @@ -35,20 +38,17 @@ some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You only need -`configure.ac' if you want to change it or regenerate `configure' using -a newer version of `autoconf'. +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. If you're - using `csh' on an old version of System V, you might need to type - `sh ./configure' instead to prevent `csh' from trying to execute - `configure' itself. + `./configure' to configure the package for your system. - Running `configure' takes awhile. While running, it prints some - messages telling which features it is checking for. + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. 2. Type `make' to compile the package. @@ -67,42 +67,57 @@ The simplest way to compile this package is: all sorts of other programs in order to regenerate files that came with the distribution. + 6. Often, you can also type `make uninstall' to remove the installed + files again. + Compilers and Options ===================== -Some systems require unusual options for compilation or linking that the -`configure' script does not know about. Run `./configure --help' for -details on some of the pertinent environment variables. + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: - ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== -You can compile the package for more than one kind of computer at the + You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their -own directory. To do this, you must use a version of `make' that -supports the `VPATH' variable, such as GNU `make'. `cd' to the +own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. - If you have to use a `make' that does not support the `VPATH' -variable, you have to compile the package for one architecture at a -time in the source code directory. After you have installed the -package for one architecture, use `make distclean' before reconfiguring -for another architecture. + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. Installation Names ================== -By default, `make install' installs the package's commands under + By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. @@ -125,7 +140,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= -Some packages pay attention to `--enable-FEATURE' options to + Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -137,14 +152,36 @@ find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `<wchar.h>' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + Specifying the System Type ========================== -There may be some features `configure' cannot figure out automatically, -but needs to determine by the type of machine the package will run on. -Usually, assuming the package is built to be run on the _same_ -architectures, `configure' can figure that out, but if it prints a -message saying it cannot guess the machine type, give it the + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: @@ -170,9 +207,9 @@ eventually be run) with `--host=TYPE'. Sharing Defaults ================ -If you want to set default values for `configure' scripts to share, you -can create a site shell script called `config.site' that gives default -values for variables like `CC', `cache_file', and `prefix'. + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. @@ -181,7 +218,7 @@ A warning: not all `configure' scripts look for a site script. Defining Variables ================== -Variables not defined in a site shell script can be set in the + Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set @@ -190,21 +227,29 @@ them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). Here is a another example: +overridden in the site shell script). - /bin/bash ./configure CONFIG_SHELL=/bin/bash +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: -Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent -configuration-related scripts to be executed by `/bin/bash'. + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== -`configure' recognizes the following options to control how it operates. + `configure' recognizes the following options to control how it +operates. `--help' `-h' - Print a summary of the options to `configure', and exit. + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. `--version' `-V' @@ -231,6 +276,16 @@ configuration-related scripts to be executed by `/bin/bash'. Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. +`--prefix=DIR' + Use DIR as the installation prefix. *Note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. diff --git a/app/xkbcomp/Makefile.am b/app/xkbcomp/Makefile.am index ffcbcbde3..cf33e6921 100644 --- a/app/xkbcomp/Makefile.am +++ b/app/xkbcomp/Makefile.am @@ -21,7 +21,7 @@ bin_PROGRAMS = xkbcomp -AM_CFLAGS = $(XKBCOMP_CFLAGS) -DDFLT_XKB_CONFIG_ROOT='"$(datadir)/X11/xkb"' +AM_CFLAGS = $(XKBCOMP_CFLAGS) -DDFLT_XKB_CONFIG_ROOT='"$(XKBCONFIGROOT)"' $(CWARNFLAGS) xkbcomp_LDADD = $(XKBCOMP_LIBS) xkbcomp_SOURCES = \ @@ -62,7 +62,8 @@ appman_PRE = \ xkbcomp.man BUILT_SOURCES = xkbparse.c -MAINTAINERCLEANFILES = $(BUILT_SOURCES) +MAINTAINERCLEANFILES = ChangeLog INSTALL +MAINTAINERCLEANFILES += $(BUILT_SOURCES) EXTRA_DIST = \ README.config \ @@ -75,36 +76,19 @@ 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 +# String replacements in MAN_SUBSTS now come from xorg-macros.m4 via configure .man.$(APP_MAN_SUFFIX): - sed $(MAN_SUBSTS) < $< > $@ + $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@ + -EXTRA_DIST += ChangeLog -MAINTAINERCLEANFILES += ChangeLog +.PHONY: ChangeLog INSTALL -.PHONY: ChangeLog +INSTALL: + $(INSTALL_CMD) 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) + $(CHANGELOG_CMD) -dist-hook: ChangeLog +dist-hook: ChangeLog INSTALL diff --git a/app/xkbcomp/Makefile.in b/app/xkbcomp/Makefile.in index 6f6557e70..795f17888 100644 --- a/app/xkbcomp/Makefile.in +++ b/app/xkbcomp/Makefile.in @@ -61,8 +61,8 @@ host_triplet = @host@ bin_PROGRAMS = xkbcomp$(EXEEXT) 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 + $(top_srcdir)/configure COPYING ChangeLog INSTALL config.guess \ + config.sub depcomp install-sh missing xkbparse.c subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac @@ -123,6 +123,7 @@ ADMIN_MAN_SUFFIX = @ADMIN_MAN_SUFFIX@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APP_MAN_DIR = @APP_MAN_DIR@ APP_MAN_SUFFIX = @APP_MAN_SUFFIX@ AUTOCONF = @AUTOCONF@ @@ -132,7 +133,10 @@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CHANGELOG_CMD = @CHANGELOG_CMD@ +CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CWARNFLAGS = @CWARNFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ @@ -141,9 +145,12 @@ DRIVER_MAN_SUFFIX = @DRIVER_MAN_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ +EGREP = @EGREP@ EXEEXT = @EXEEXT@ FILE_MAN_DIR = @FILE_MAN_DIR@ FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ +GREP = @GREP@ +INSTALL_CMD = @INSTALL_CMD@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -158,6 +165,7 @@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ +MAN_SUBSTS = @MAN_SUBSTS@ MISC_MAN_DIR = @MISC_MAN_DIR@ MISC_MAN_SUFFIX = @MISC_MAN_SUFFIX@ OBJEXT = @OBJEXT@ @@ -169,16 +177,19 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ +SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XKBCOMP_CFLAGS = @XKBCOMP_CFLAGS@ XKBCOMP_LIBS = @XKBCOMP_LIBS@ +XKBCONFIGROOT = @XKBCONFIGROOT@ +XORG_MAN_PAGE = @XORG_MAN_PAGE@ YACC = @YACC@ +YACC_INST = @YACC_INST@ +YFLAGS = @YFLAGS@ ac_ct_CC = @ac_ct_CC@ -ac_ct_STRIP = @ac_ct_STRIP@ -ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ @@ -193,28 +204,35 @@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ 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@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ -AM_CFLAGS = $(XKBCOMP_CFLAGS) -DDFLT_XKB_CONFIG_ROOT='"$(datadir)/X11/xkb"' +AM_CFLAGS = $(XKBCOMP_CFLAGS) -DDFLT_XKB_CONFIG_ROOT='"$(XKBCONFIGROOT)"' $(CWARNFLAGS) xkbcomp_LDADD = $(XKBCOMP_LIBS) xkbcomp_SOURCES = \ action.c \ @@ -254,29 +272,11 @@ appman_PRE = \ xkbcomp.man BUILT_SOURCES = xkbparse.c -MAINTAINERCLEANFILES = $(BUILT_SOURCES) ChangeLog -EXTRA_DIST = README.config README.enhancing $(appman_PRE) ChangeLog +MAINTAINERCLEANFILES = ChangeLog INSTALL $(BUILT_SOURCES) +EXTRA_DIST = README.config README.enhancing $(appman_PRE) 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 @@ -289,15 +289,15 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ - cd $(srcdir) && $(AUTOMAKE) --gnu \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ + cd $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu Makefile + $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -722,15 +722,19 @@ uninstall-am: uninstall-appmanDATA uninstall-binPROGRAMS \ uninstall-info-am +# String replacements in MAN_SUBSTS now come from xorg-macros.m4 via configure .man.$(APP_MAN_SUFFIX): - sed $(MAN_SUBSTS) < $< > $@ + $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@ + +.PHONY: ChangeLog INSTALL -.PHONY: ChangeLog +INSTALL: + $(INSTALL_CMD) 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) + $(CHANGELOG_CMD) -dist-hook: ChangeLog +dist-hook: ChangeLog INSTALL # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/app/xkbcomp/NEWS b/app/xkbcomp/NEWS deleted file mode 100644 index e69de29bb..000000000 --- a/app/xkbcomp/NEWS +++ /dev/null diff --git a/app/xkbcomp/README b/app/xkbcomp/README index 8dd7a58c3..89dc3e638 100644 --- a/app/xkbcomp/README +++ b/app/xkbcomp/README @@ -22,4 +22,3 @@ For information how to further enhance XKB configuration see 'README.enhancing' file. -$XFree86$ diff --git a/app/xkbcomp/README.config b/app/xkbcomp/README.config index 4d3f2d5ba..2cce52157 100644 --- a/app/xkbcomp/README.config +++ b/app/xkbcomp/README.config @@ -193,4 +193,3 @@ 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/app/xkbcomp/README.enhancing b/app/xkbcomp/README.enhancing index a8456e891..746902c52 100644 --- a/app/xkbcomp/README.enhancing +++ b/app/xkbcomp/README.enhancing @@ -506,4 +506,3 @@ rules file described above the .lst file could look like: And that should be it. Enjoy creating your own xkb mapping. -$XdotOrg$ diff --git a/app/xkbcomp/aclocal.m4 b/app/xkbcomp/aclocal.m4 index 48f9f8de2..3f71a4321 100644 --- a/app/xkbcomp/aclocal.m4 +++ b/app/xkbcomp/aclocal.m4 @@ -995,33 +995,28 @@ AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR +dnl xorg-macros.m4. Generated from xorg-macros.m4.in xorgversion.m4 by configure. dnl -dnl Copyright 2005-2006 Sun Microsystems, Inc. All rights reserved. +dnl Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. dnl dnl Permission is hereby granted, free of charge, to any person obtaining a -dnl copy of this software and associated documentation files (the -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 copy of this software and associated documentation files (the "Software"), +dnl to deal in the Software without restriction, including without limitation +dnl the rights to use, copy, modify, merge, publish, distribute, sublicense, +dnl and/or sell copies of the Software, and to permit persons to whom the +dnl Software is furnished to do so, subject to the following conditions: dnl -dnl THE 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 The above copyright notice and this permission notice (including the next +dnl paragraph) shall be included in all copies or substantial portions of the +dnl Software. dnl -dnl 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. +dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +dnl IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +dnl FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +dnl THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +dnl LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +dnl FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +dnl DEALINGS IN THE SOFTWARE. # XORG_MACROS_VERSION(required-version) # ------------------------------------- @@ -1031,27 +1026,24 @@ dnl of the copyright holder. # 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])]) +# To ensure that this macro is defined, also add: +# m4_ifndef([XORG_MACROS_VERSION], +# [m4_fatal([must install xorg-macros 1.1 or later before running autoconf/autogen])]) # # # See the "minimum version" comment for each macro you use to see what # version you require. -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.6 - 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]) +m4_defun([XORG_MACROS_VERSION],[ +m4_define([vers_have], [1.11.0]) +m4_define([maj_have], m4_substr(vers_have, 0, m4_index(vers_have, [.]))) +m4_define([maj_needed], m4_substr([$1], 0, m4_index([$1], [.]))) +m4_if(m4_cmp(maj_have, maj_needed), 0,, + [m4_fatal([xorg-macros major version ]maj_needed[ is required but ]vers_have[ found])]) +m4_if(m4_version_compare(vers_have, [$1]), -1, + [m4_fatal([xorg-macros version $1 or higher is required but ]vers_have[ found])]) +m4_undefine([vers_have]) +m4_undefine([maj_have]) +m4_undefine([maj_needed]) ]) # XORG_MACROS_VERSION # XORG_PROG_RAWCPP() @@ -1076,6 +1068,10 @@ else if test `${RAWCPP} -undef < conftest.$ac_ext | grep -c 'unix'` -eq 1 ; then RAWCPPFLAGS=-undef AC_MSG_RESULT([yes]) + # under Cygwin unix is still defined even with -undef + elif test `${RAWCPP} -undef -ansi < conftest.$ac_ext | grep -c 'unix'` -eq 1 ; then + RAWCPPFLAGS="-undef -ansi" + AC_MSG_RESULT([yes, with -ansi]) else AC_MSG_ERROR([${RAWCPP} defines unix with or without -undef. I don't know what to do.]) fi @@ -1106,9 +1102,12 @@ AC_SUBST(RAWCPPFLAGS) # on this OS - replaces *ManSuffix settings in old Imake *.cf per-os files. # Not sure if there's any better way than just hardcoding by OS name. # Override default settings by setting environment variables +# Added MAN_SUBSTS in version 1.8 +# Added AC_PROG_SED in version 1.8 AC_DEFUN([XORG_MANPAGE_SECTIONS],[ AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_SED]) if test x$APP_MAN_SUFFIX = x ; then APP_MAN_SUFFIX=1 @@ -1177,8 +1176,60 @@ AC_SUBST([FILE_MAN_DIR]) AC_SUBST([MISC_MAN_DIR]) AC_SUBST([DRIVER_MAN_DIR]) AC_SUBST([ADMIN_MAN_DIR]) + +XORG_MAN_PAGE="X Version 11" +AC_SUBST([XORG_MAN_PAGE]) +MAN_SUBSTS="\ + -e 's|__vendorversion__|\"\$(PACKAGE_STRING)\" \"\$(XORG_MAN_PAGE)\"|' \ + -e 's|__xorgversion__|\"\$(PACKAGE_STRING)\" \"\$(XORG_MAN_PAGE)\"|' \ + -e 's|__xservername__|Xorg|g' \ + -e 's|__xconfigfile__|xorg.conf|g' \ + -e 's|__projectroot__|\$(prefix)|g' \ + -e 's|__apploaddir__|\$(appdefaultdir)|g' \ + -e 's|__appmansuffix__|\$(APP_MAN_SUFFIX)|g' \ + -e 's|__drivermansuffix__|\$(DRIVER_MAN_SUFFIX)|g' \ + -e 's|__adminmansuffix__|\$(ADMIN_MAN_SUFFIX)|g' \ + -e 's|__libmansuffix__|\$(LIB_MAN_SUFFIX)|g' \ + -e 's|__miscmansuffix__|\$(MISC_MAN_SUFFIX)|g' \ + -e 's|__filemansuffix__|\$(FILE_MAN_SUFFIX)|g'" +AC_SUBST([MAN_SUBSTS]) + ]) # XORG_MANPAGE_SECTIONS +# XORG_CHECK_SGML_DOCTOOLS([MIN-VERSION]) +# ------------------------ +# Minimum version: 1.7.0 +# +# Defines the variable XORG_SGML_PATH containing the location of X11/defs.ent +# provided by xorg-sgml-doctools, if installed. +AC_DEFUN([XORG_CHECK_SGML_DOCTOOLS],[ +AC_MSG_CHECKING([for X.Org SGML entities m4_ifval([$1],[>= $1])]) +XORG_SGML_PATH= +PKG_CHECK_EXISTS([xorg-sgml-doctools m4_ifval([$1],[>= $1])], + [XORG_SGML_PATH=`$PKG_CONFIG --variable=sgmlrootdir xorg-sgml-doctools`], + [m4_ifval([$1],[:], + [if test x"$cross_compiling" != x"yes" ; then + AC_CHECK_FILE([$prefix/share/sgml/X11/defs.ent], + [XORG_SGML_PATH=$prefix/share/sgml]) + fi]) + ]) + +# Define variables STYLESHEET_SRCDIR and XSL_STYLESHEET containing +# the path and the name of the doc stylesheet +if test "x$XORG_SGML_PATH" != "x" ; then + AC_MSG_RESULT([$XORG_SGML_PATH]) + STYLESHEET_SRCDIR=$XORG_SGML_PATH/X11 + XSL_STYLESHEET=$STYLESHEET_SRCDIR/xorg.xsl +else + AC_MSG_RESULT([no]) +fi + +AC_SUBST(XORG_SGML_PATH) +AC_SUBST(STYLESHEET_SRCDIR) +AC_SUBST(XSL_STYLESHEET) +AM_CONDITIONAL([HAVE_STYLESHEETS], [test "x$XSL_STYLESHEET" != "x"]) +]) # XORG_CHECK_SGML_DOCTOOLS + # XORG_CHECK_LINUXDOC # ------------------- # Minimum version: 1.0.0 @@ -1188,21 +1239,14 @@ AC_SUBST([ADMIN_MAN_DIR]) # 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_REQUIRE([XORG_CHECK_SGML_DOCTOOLS]) +AC_REQUIRE([XORG_WITH_PS2PDF]) AC_PATH_PROG(LINUXDOC, linuxdoc) -AC_PATH_PROG(PS2PDF, ps2pdf) -AC_MSG_CHECKING([Whether to build documentation]) +AC_MSG_CHECKING([whether to build documentation]) -if test x$HAVE_DEFS_ENT != x && test x$LINUXDOC != x ; then +if test x$XORG_SGML_PATH != x && test x$LINUXDOC != x ; then BUILDDOC=yes else BUILDDOC=no @@ -1212,9 +1256,9 @@ AM_CONDITIONAL(BUILD_LINUXDOC, [test x$BUILDDOC = xyes]) AC_MSG_RESULT([$BUILDDOC]) -AC_MSG_CHECKING([Whether to build pdf documentation]) +AC_MSG_CHECKING([whether to build pdf documentation]) -if test x$PS2PDF != x && test x$BUILD_PDFDOC != xno; then +if test x$have_ps2pdf != xno && test x$BUILD_PDFDOC != xno; then BUILDPDFDOC=yes else BUILDPDFDOC=no @@ -1224,7 +1268,7 @@ 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_TEXT="SGML_SEARCH_PATH=$XORG_SGML_PATH GROFF_NO_SGR=y $LINUXDOC -B txt -f" MAKE_PS="SGML_SEARCH_PATH=$XORG_SGML_PATH $LINUXDOC -B latex --papersize=letter --output=ps" MAKE_PDF="$PS2PDF" MAKE_HTML="SGML_SEARCH_PATH=$XORG_SGML_PATH $LINUXDOC -B html --split=0" @@ -1244,46 +1288,44 @@ AC_SUBST(MAKE_HTML) # 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= +AC_REQUIRE([XORG_CHECK_SGML_DOCTOOLS]) + 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 && +AC_MSG_CHECKING([whether to build text documentation]) +if test x$XORG_SGML_PATH != x && test x$DOCBOOKTXT != x && test x$BUILD_TXTDOC != xno; then BUILDTXTDOC=yes fi AM_CONDITIONAL(BUILD_TXTDOC, [test x$BUILDTXTDOC = xyes]) AC_MSG_RESULT([$BUILDTXTDOC]) -AC_MSG_CHECKING([Whether to build PDF documentation]) -if test x$HAVE_DEFS_ENT != x && test x$DOCBOOKPDF != x && +AC_MSG_CHECKING([whether to build PDF documentation]) +if test x$XORG_SGML_PATH != x && test x$DOCBOOKPDF != x && test x$BUILD_PDFDOC != xno; then BUILDPDFDOC=yes fi AM_CONDITIONAL(BUILD_PDFDOC, [test x$BUILDPDFDOC = xyes]) AC_MSG_RESULT([$BUILDPDFDOC]) -AC_MSG_CHECKING([Whether to build PostScript documentation]) -if test x$HAVE_DEFS_ENT != x && test x$DOCBOOKPS != x && +AC_MSG_CHECKING([whether to build PostScript documentation]) +if test x$XORG_SGML_PATH != x && test x$DOCBOOKPS != x && test x$BUILD_PSDOC != xno; then BUILDPSDOC=yes fi AM_CONDITIONAL(BUILD_PSDOC, [test x$BUILDPSDOC = xyes]) AC_MSG_RESULT([$BUILDPSDOC]) -AC_MSG_CHECKING([Whether to build HTML documentation]) -if test x$HAVE_DEFS_ENT != x && test x$DOCBOOKHTML != x && +AC_MSG_CHECKING([whether to build HTML documentation]) +if test x$XORG_SGML_PATH != x && test x$DOCBOOKHTML != x && test x$BUILD_HTMLDOC != xno; then BUILDHTMLDOC=yes fi @@ -1301,6 +1343,548 @@ AC_SUBST(MAKE_PDF) AC_SUBST(MAKE_HTML) ]) # XORG_CHECK_DOCBOOK +# XORG_WITH_XMLTO([MIN-VERSION], [DEFAULT]) +# ---------------- +# Minimum version: 1.5.0 +# Minimum version for optional DEFAULT argument: 1.11.0 +# +# Documentation tools are not always available on all platforms and sometimes +# not at the appropriate level. This macro enables a module to test for the +# presence of the tool and obtain it's path in separate variables. Coupled with +# the --with-xmlto option, it allows maximum flexibilty in making decisions +# as whether or not to use the xmlto package. When DEFAULT is not specified, +# --with-xmlto assumes 'auto'. +# +# Interface to module: +# HAVE_XMLTO: used in makefiles to conditionally generate documentation +# XMLTO: returns the path of the xmlto program found +# returns the path set by the user in the environment +# --with-xmlto: 'yes' user instructs the module to use xmlto +# 'no' user instructs the module not to use xmlto +# +# Added in version 1.10.0 +# HAVE_XMLTO_TEXT: used in makefiles to conditionally generate text documentation +# xmlto for text output requires either lynx, links, or w3m browsers +# +# If the user sets the value of XMLTO, AC_PATH_PROG skips testing the path. +# +AC_DEFUN([XORG_WITH_XMLTO],[ +AC_ARG_VAR([XMLTO], [Path to xmlto command]) +m4_define([_defopt], m4_default([$2], [auto])) +AC_ARG_WITH(xmlto, + AS_HELP_STRING([--with-xmlto], + [Use xmlto to regenerate documentation (default: ]_defopt[)]), + [use_xmlto=$withval], [use_xmlto=]_defopt) +m4_undefine([_defopt]) + +if test "x$use_xmlto" = x"auto"; then + AC_PATH_PROG([XMLTO], [xmlto]) + if test "x$XMLTO" = "x"; then + AC_MSG_WARN([xmlto not found - documentation targets will be skipped]) + have_xmlto=no + else + have_xmlto=yes + fi +elif test "x$use_xmlto" = x"yes" ; then + AC_PATH_PROG([XMLTO], [xmlto]) + if test "x$XMLTO" = "x"; then + AC_MSG_ERROR([--with-xmlto=yes specified but xmlto not found in PATH]) + fi + have_xmlto=yes +elif test "x$use_xmlto" = x"no" ; then + if test "x$XMLTO" != "x"; then + AC_MSG_WARN([ignoring XMLTO environment variable since --with-xmlto=no was specified]) + fi + have_xmlto=no +else + AC_MSG_ERROR([--with-xmlto expects 'yes' or 'no']) +fi + +# Test for a minimum version of xmlto, if provided. +m4_ifval([$1], +[if test "$have_xmlto" = yes; then + # scrape the xmlto version + AC_MSG_CHECKING([the xmlto version]) + xmlto_version=`$XMLTO --version 2>/dev/null | cut -d' ' -f3` + AC_MSG_RESULT([$xmlto_version]) + AS_VERSION_COMPARE([$xmlto_version], [$1], + [if test "x$use_xmlto" = xauto; then + AC_MSG_WARN([xmlto version $xmlto_version found, but $1 needed]) + have_xmlto=no + else + AC_MSG_ERROR([xmlto version $xmlto_version found, but $1 needed]) + fi]) +fi]) + +# Test for the ability of xmlto to generate a text target +have_xmlto_text=no +cat > conftest.xml << "EOF" +EOF +AS_IF([test "$have_xmlto" = yes], + [AS_IF([$XMLTO --skip-validation txt conftest.xml >/dev/null 2>&1], + [have_xmlto_text=yes], + [AC_MSG_WARN([xmlto cannot generate text format, this format skipped])])]) +rm -f conftest.xml +AM_CONDITIONAL([HAVE_XMLTO_TEXT], [test $have_xmlto_text = yes]) +AM_CONDITIONAL([HAVE_XMLTO], [test "$have_xmlto" = yes]) +]) # XORG_WITH_XMLTO + +# XORG_WITH_ASCIIDOC([MIN-VERSION], [DEFAULT]) +# ---------------- +# Minimum version: 1.5.0 +# Minimum version for optional DEFAULT argument: 1.11.0 +# +# Documentation tools are not always available on all platforms and sometimes +# not at the appropriate level. This macro enables a module to test for the +# presence of the tool and obtain it's path in separate variables. Coupled with +# the --with-asciidoc option, it allows maximum flexibilty in making decisions +# as whether or not to use the asciidoc package. When DEFAULT is not specified, +# --with-asciidoc assumes 'auto'. +# +# Interface to module: +# HAVE_ASCIIDOC: used in makefiles to conditionally generate documentation +# ASCIIDOC: returns the path of the asciidoc program found +# returns the path set by the user in the environment +# --with-asciidoc: 'yes' user instructs the module to use asciidoc +# 'no' user instructs the module not to use asciidoc +# +# If the user sets the value of ASCIIDOC, AC_PATH_PROG skips testing the path. +# +AC_DEFUN([XORG_WITH_ASCIIDOC],[ +AC_ARG_VAR([ASCIIDOC], [Path to asciidoc command]) +m4_define([_defopt], m4_default([$2], [auto])) +AC_ARG_WITH(asciidoc, + AS_HELP_STRING([--with-asciidoc], + [Use asciidoc to regenerate documentation (default: ]_defopt[)]), + [use_asciidoc=$withval], [use_asciidoc=]_defopt) +m4_undefine([_defopt]) + +if test "x$use_asciidoc" = x"auto"; then + AC_PATH_PROG([ASCIIDOC], [asciidoc]) + if test "x$ASCIIDOC" = "x"; then + AC_MSG_WARN([asciidoc not found - documentation targets will be skipped]) + have_asciidoc=no + else + have_asciidoc=yes + fi +elif test "x$use_asciidoc" = x"yes" ; then + AC_PATH_PROG([ASCIIDOC], [asciidoc]) + if test "x$ASCIIDOC" = "x"; then + AC_MSG_ERROR([--with-asciidoc=yes specified but asciidoc not found in PATH]) + fi + have_asciidoc=yes +elif test "x$use_asciidoc" = x"no" ; then + if test "x$ASCIIDOC" != "x"; then + AC_MSG_WARN([ignoring ASCIIDOC environment variable since --with-asciidoc=no was specified]) + fi + have_asciidoc=no +else + AC_MSG_ERROR([--with-asciidoc expects 'yes' or 'no']) +fi +m4_ifval([$1], +[if test "$have_asciidoc" = yes; then + # scrape the asciidoc version + AC_MSG_CHECKING([the asciidoc version]) + asciidoc_version=`$ASCIIDOC --version 2>/dev/null | cut -d' ' -f2` + AC_MSG_RESULT([$asciidoc_version]) + AS_VERSION_COMPARE([$asciidoc_version], [$1], + [if test "x$use_asciidoc" = xauto; then + AC_MSG_WARN([asciidoc version $asciidoc_version found, but $1 needed]) + have_asciidoc=no + else + AC_MSG_ERROR([asciidoc version $asciidoc_version found, but $1 needed]) + fi]) +fi]) +AM_CONDITIONAL([HAVE_ASCIIDOC], [test "$have_asciidoc" = yes]) +]) # XORG_WITH_ASCIIDOC + +# XORG_WITH_DOXYGEN([MIN-VERSION], [DEFAULT]) +# -------------------------------- +# Minimum version: 1.5.0 +# Minimum version for optional DEFAULT argument: 1.11.0 +# +# Documentation tools are not always available on all platforms and sometimes +# not at the appropriate level. This macro enables a module to test for the +# presence of the tool and obtain it's path in separate variables. Coupled with +# the --with-doxygen option, it allows maximum flexibilty in making decisions +# as whether or not to use the doxygen package. When DEFAULT is not specified, +# --with-doxygen assumes 'auto'. +# +# Interface to module: +# HAVE_DOXYGEN: used in makefiles to conditionally generate documentation +# DOXYGEN: returns the path of the doxygen program found +# returns the path set by the user in the environment +# --with-doxygen: 'yes' user instructs the module to use doxygen +# 'no' user instructs the module not to use doxygen +# +# If the user sets the value of DOXYGEN, AC_PATH_PROG skips testing the path. +# +AC_DEFUN([XORG_WITH_DOXYGEN],[ +AC_ARG_VAR([DOXYGEN], [Path to doxygen command]) +m4_define([_defopt], m4_default([$2], [auto])) +AC_ARG_WITH(doxygen, + AS_HELP_STRING([--with-doxygen], + [Use doxygen to regenerate documentation (default: ]_defopt[)]), + [use_doxygen=$withval], [use_doxygen=]_defopt) +m4_undefine([_defopt]) + +if test "x$use_doxygen" = x"auto"; then + AC_PATH_PROG([DOXYGEN], [doxygen]) + if test "x$DOXYGEN" = "x"; then + AC_MSG_WARN([doxygen not found - documentation targets will be skipped]) + have_doxygen=no + else + have_doxygen=yes + fi +elif test "x$use_doxygen" = x"yes" ; then + AC_PATH_PROG([DOXYGEN], [doxygen]) + if test "x$DOXYGEN" = "x"; then + AC_MSG_ERROR([--with-doxygen=yes specified but doxygen not found in PATH]) + fi + have_doxygen=yes +elif test "x$use_doxygen" = x"no" ; then + if test "x$DOXYGEN" != "x"; then + AC_MSG_WARN([ignoring DOXYGEN environment variable since --with-doxygen=no was specified]) + fi + have_doxygen=no +else + AC_MSG_ERROR([--with-doxygen expects 'yes' or 'no']) +fi +m4_ifval([$1], +[if test "$have_doxygen" = yes; then + # scrape the doxygen version + AC_MSG_CHECKING([the doxygen version]) + doxygen_version=`$DOXYGEN --version 2>/dev/null` + AC_MSG_RESULT([$doxygen_version]) + AS_VERSION_COMPARE([$doxygen_version], [$1], + [if test "x$use_doxygen" = xauto; then + AC_MSG_WARN([doxygen version $doxygen_version found, but $1 needed]) + have_doxygen=no + else + AC_MSG_ERROR([doxygen version $doxygen_version found, but $1 needed]) + fi]) +fi]) +AM_CONDITIONAL([HAVE_DOXYGEN], [test "$have_doxygen" = yes]) +]) # XORG_WITH_DOXYGEN + +# XORG_WITH_GROFF([DEFAULT]) +# ---------------- +# Minimum version: 1.6.0 +# Minimum version for optional DEFAULT argument: 1.11.0 +# +# Documentation tools are not always available on all platforms and sometimes +# not at the appropriate level. This macro enables a module to test for the +# presence of the tool and obtain it's path in separate variables. Coupled with +# the --with-groff option, it allows maximum flexibilty in making decisions +# as whether or not to use the groff package. When DEFAULT is not specified, +# --with-groff assumes 'auto'. +# +# Interface to module: +# HAVE_GROFF: used in makefiles to conditionally generate documentation +# HAVE_GROFF_MM: the memorandum macros (-mm) package +# HAVE_GROFF_MS: the -ms macros package +# GROFF: returns the path of the groff program found +# returns the path set by the user in the environment +# --with-groff: 'yes' user instructs the module to use groff +# 'no' user instructs the module not to use groff +# +# Added in version 1.9.0: +# HAVE_GROFF_HTML: groff has dependencies to output HTML format: +# pnmcut pnmcrop pnmtopng pnmtops from the netpbm package. +# psselect from the psutils package. +# the ghostcript package. Refer to the grohtml man pages +# +# If the user sets the value of GROFF, AC_PATH_PROG skips testing the path. +# +# OS and distros often splits groff in a basic and full package, the former +# having the groff program and the later having devices, fonts and macros +# Checking for the groff executable is not enough. +# +# If macros are missing, we cannot assume that groff is useless, so we don't +# unset HAVE_GROFF or GROFF env variables. +# HAVE_GROFF_?? can never be true while HAVE_GROFF is false. +# +AC_DEFUN([XORG_WITH_GROFF],[ +AC_ARG_VAR([GROFF], [Path to groff command]) +m4_define([_defopt], m4_default([$1], [auto])) +AC_ARG_WITH(groff, + AS_HELP_STRING([--with-groff], + [Use groff to regenerate documentation (default: ]_defopt[)]), + [use_groff=$withval], [use_groff=]_defopt) +m4_undefine([_defopt]) + +if test "x$use_groff" = x"auto"; then + AC_PATH_PROG([GROFF], [groff]) + if test "x$GROFF" = "x"; then + AC_MSG_WARN([groff not found - documentation targets will be skipped]) + have_groff=no + else + have_groff=yes + fi +elif test "x$use_groff" = x"yes" ; then + AC_PATH_PROG([GROFF], [groff]) + if test "x$GROFF" = "x"; then + AC_MSG_ERROR([--with-groff=yes specified but groff not found in PATH]) + fi + have_groff=yes +elif test "x$use_groff" = x"no" ; then + if test "x$GROFF" != "x"; then + AC_MSG_WARN([ignoring GROFF environment variable since --with-groff=no was specified]) + fi + have_groff=no +else + AC_MSG_ERROR([--with-groff expects 'yes' or 'no']) +fi + +# We have groff, test for the presence of the macro packages +if test "x$have_groff" = x"yes"; then + AC_MSG_CHECKING([for ${GROFF} -ms macros]) + if ${GROFF} -ms -I. /dev/null >/dev/null 2>&1 ; then + groff_ms_works=yes + else + groff_ms_works=no + fi + AC_MSG_RESULT([$groff_ms_works]) + AC_MSG_CHECKING([for ${GROFF} -mm macros]) + if ${GROFF} -mm -I. /dev/null >/dev/null 2>&1 ; then + groff_mm_works=yes + else + groff_mm_works=no + fi + AC_MSG_RESULT([$groff_mm_works]) +fi + +# We have groff, test for HTML dependencies, one command per package +if test "x$have_groff" = x"yes"; then + AC_PATH_PROGS(GS_PATH, [gs gswin32c]) + AC_PATH_PROG(PNMTOPNG_PATH, [pnmtopng]) + AC_PATH_PROG(PSSELECT_PATH, [psselect]) + if test "x$GS_PATH" != "x" -a "x$PNMTOPNG_PATH" != "x" -a "x$PSSELECT_PATH" != "x"; then + have_groff_html=yes + else + have_groff_html=no + AC_MSG_WARN([grohtml dependencies not found - HTML Documentation skipped. Refer to grohtml man pages]) + fi +fi + +# Set Automake conditionals for Makefiles +AM_CONDITIONAL([HAVE_GROFF], [test "$have_groff" = yes]) +AM_CONDITIONAL([HAVE_GROFF_MS], [test "$groff_ms_works" = yes]) +AM_CONDITIONAL([HAVE_GROFF_MM], [test "$groff_mm_works" = yes]) +AM_CONDITIONAL([HAVE_GROFF_HTML], [test "$have_groff_html" = yes]) +]) # XORG_WITH_GROFF + +# XORG_WITH_FOP([DEFAULT]) +# ---------------- +# Minimum version: 1.6.0 +# Minimum version for optional DEFAULT argument: 1.11.0 +# +# Documentation tools are not always available on all platforms and sometimes +# not at the appropriate level. This macro enables a module to test for the +# presence of the tool and obtain it's path in separate variables. Coupled with +# the --with-fop option, it allows maximum flexibilty in making decisions +# as whether or not to use the fop package. When DEFAULT is not specified, +# --with-fop assumes 'auto'. +# +# Interface to module: +# HAVE_FOP: used in makefiles to conditionally generate documentation +# FOP: returns the path of the fop program found +# returns the path set by the user in the environment +# --with-fop: 'yes' user instructs the module to use fop +# 'no' user instructs the module not to use fop +# +# If the user sets the value of FOP, AC_PATH_PROG skips testing the path. +# +AC_DEFUN([XORG_WITH_FOP],[ +AC_ARG_VAR([FOP], [Path to fop command]) +m4_define([_defopt], m4_default([$1], [auto])) +AC_ARG_WITH(fop, + AS_HELP_STRING([--with-fop], + [Use fop to regenerate documentation (default: ]_defopt[)]), + [use_fop=$withval], [use_fop=]_defopt) +m4_undefine([_defopt]) + +if test "x$use_fop" = x"auto"; then + AC_PATH_PROG([FOP], [fop]) + if test "x$FOP" = "x"; then + AC_MSG_WARN([fop not found - documentation targets will be skipped]) + have_fop=no + else + have_fop=yes + fi +elif test "x$use_fop" = x"yes" ; then + AC_PATH_PROG([FOP], [fop]) + if test "x$FOP" = "x"; then + AC_MSG_ERROR([--with-fop=yes specified but fop not found in PATH]) + fi + have_fop=yes +elif test "x$use_fop" = x"no" ; then + if test "x$FOP" != "x"; then + AC_MSG_WARN([ignoring FOP environment variable since --with-fop=no was specified]) + fi + have_fop=no +else + AC_MSG_ERROR([--with-fop expects 'yes' or 'no']) +fi +AM_CONDITIONAL([HAVE_FOP], [test "$have_fop" = yes]) +]) # XORG_WITH_FOP + +# XORG_WITH_PS2PDF([DEFAULT]) +# ---------------- +# Minimum version: 1.6.0 +# Minimum version for optional DEFAULT argument: 1.11.0 +# +# Documentation tools are not always available on all platforms and sometimes +# not at the appropriate level. This macro enables a module to test for the +# presence of the tool and obtain it's path in separate variables. Coupled with +# the --with-ps2pdf option, it allows maximum flexibilty in making decisions +# as whether or not to use the ps2pdf package. When DEFAULT is not specified, +# --with-ps2pdf assumes 'auto'. +# +# Interface to module: +# HAVE_PS2PDF: used in makefiles to conditionally generate documentation +# PS2PDF: returns the path of the ps2pdf program found +# returns the path set by the user in the environment +# --with-ps2pdf: 'yes' user instructs the module to use ps2pdf +# 'no' user instructs the module not to use ps2pdf +# +# If the user sets the value of PS2PDF, AC_PATH_PROG skips testing the path. +# +AC_DEFUN([XORG_WITH_PS2PDF],[ +AC_ARG_VAR([PS2PDF], [Path to ps2pdf command]) +m4_define([_defopt], m4_default([$1], [auto])) +AC_ARG_WITH(ps2pdf, + AS_HELP_STRING([--with-ps2pdf], + [Use ps2pdf to regenerate documentation (default: ]_defopt[)]), + [use_ps2pdf=$withval], [use_ps2pdf=]_defopt) +m4_undefine([_defopt]) + +if test "x$use_ps2pdf" = x"auto"; then + AC_PATH_PROG([PS2PDF], [ps2pdf]) + if test "x$PS2PDF" = "x"; then + AC_MSG_WARN([ps2pdf not found - documentation targets will be skipped]) + have_ps2pdf=no + else + have_ps2pdf=yes + fi +elif test "x$use_ps2pdf" = x"yes" ; then + AC_PATH_PROG([PS2PDF], [ps2pdf]) + if test "x$PS2PDF" = "x"; then + AC_MSG_ERROR([--with-ps2pdf=yes specified but ps2pdf not found in PATH]) + fi + have_ps2pdf=yes +elif test "x$use_ps2pdf" = x"no" ; then + if test "x$PS2PDF" != "x"; then + AC_MSG_WARN([ignoring PS2PDF environment variable since --with-ps2pdf=no was specified]) + fi + have_ps2pdf=no +else + AC_MSG_ERROR([--with-ps2pdf expects 'yes' or 'no']) +fi +AM_CONDITIONAL([HAVE_PS2PDF], [test "$have_ps2pdf" = yes]) +]) # XORG_WITH_PS2PDF + +# XORG_ENABLE_DOCS (enable_docs=yes) +# ---------------- +# Minimum version: 1.6.0 +# +# Documentation tools are not always available on all platforms and sometimes +# not at the appropriate level. This macro enables a builder to skip all +# documentation targets except traditional man pages. +# Combined with the specific tool checking macros XORG_WITH_*, it provides +# maximum flexibilty in controlling documentation building. +# Refer to: +# XORG_WITH_XMLTO --with-xmlto +# XORG_WITH_ASCIIDOC --with-asciidoc +# XORG_WITH_DOXYGEN --with-doxygen +# XORG_WITH_FOP --with-fop +# XORG_WITH_GROFF --with-groff +# XORG_WITH_PS2PDF --with-ps2pdf +# +# Interface to module: +# ENABLE_DOCS: used in makefiles to conditionally generate documentation +# --enable-docs: 'yes' user instructs the module to generate docs +# 'no' user instructs the module not to generate docs +# parm1: specify the default value, yes or no. +# +AC_DEFUN([XORG_ENABLE_DOCS],[ +m4_define([default], m4_default([$1], [yes])) +AC_ARG_ENABLE(docs, + AS_HELP_STRING([--enable-docs], + [Enable building the documentation (default: ]default[)]), + [build_docs=$enableval], [build_docs=]default) +m4_undefine([default]) +AM_CONDITIONAL(ENABLE_DOCS, [test x$build_docs = xyes]) +AC_MSG_CHECKING([whether to build documentation]) +AC_MSG_RESULT([$build_docs]) +]) # XORG_ENABLE_DOCS + +# XORG_ENABLE_DEVEL_DOCS (enable_devel_docs=yes) +# ---------------- +# Minimum version: 1.6.0 +# +# This macro enables a builder to skip all developer documentation. +# Combined with the specific tool checking macros XORG_WITH_*, it provides +# maximum flexibilty in controlling documentation building. +# Refer to: +# XORG_WITH_XMLTO --with-xmlto +# XORG_WITH_ASCIIDOC --with-asciidoc +# XORG_WITH_DOXYGEN --with-doxygen +# XORG_WITH_FOP --with-fop +# XORG_WITH_GROFF --with-groff +# XORG_WITH_PS2PDF --with-ps2pdf +# +# Interface to module: +# ENABLE_DEVEL_DOCS: used in makefiles to conditionally generate developer docs +# --enable-devel-docs: 'yes' user instructs the module to generate developer docs +# 'no' user instructs the module not to generate developer docs +# parm1: specify the default value, yes or no. +# +AC_DEFUN([XORG_ENABLE_DEVEL_DOCS],[ +m4_define([devel_default], m4_default([$1], [yes])) +AC_ARG_ENABLE(devel-docs, + AS_HELP_STRING([--enable-devel-docs], + [Enable building the developer documentation (default: ]devel_default[)]), + [build_devel_docs=$enableval], [build_devel_docs=]devel_default) +m4_undefine([devel_default]) +AM_CONDITIONAL(ENABLE_DEVEL_DOCS, [test x$build_devel_docs = xyes]) +AC_MSG_CHECKING([whether to build developer documentation]) +AC_MSG_RESULT([$build_devel_docs]) +]) # XORG_ENABLE_DEVEL_DOCS + +# XORG_ENABLE_SPECS (enable_specs=yes) +# ---------------- +# Minimum version: 1.6.0 +# +# This macro enables a builder to skip all functional specification targets. +# Combined with the specific tool checking macros XORG_WITH_*, it provides +# maximum flexibilty in controlling documentation building. +# Refer to: +# XORG_WITH_XMLTO --with-xmlto +# XORG_WITH_ASCIIDOC --with-asciidoc +# XORG_WITH_DOXYGEN --with-doxygen +# XORG_WITH_FOP --with-fop +# XORG_WITH_GROFF --with-groff +# XORG_WITH_PS2PDF --with-ps2pdf +# +# Interface to module: +# ENABLE_SPECS: used in makefiles to conditionally generate specs +# --enable-specs: 'yes' user instructs the module to generate specs +# 'no' user instructs the module not to generate specs +# parm1: specify the default value, yes or no. +# +AC_DEFUN([XORG_ENABLE_SPECS],[ +m4_define([spec_default], m4_default([$1], [yes])) +AC_ARG_ENABLE(specs, + AS_HELP_STRING([--enable-specs], + [Enable building the specs (default: ]spec_default[)]), + [build_specs=$enableval], [build_specs=]spec_default) +m4_undefine([spec_default]) +AM_CONDITIONAL(ENABLE_SPECS, [test x$build_specs = xyes]) +AC_MSG_CHECKING([whether to build functional specifications]) +AC_MSG_RESULT([$build_specs]) +]) # XORG_ENABLE_SPECS + # XORG_CHECK_MALLOC_ZERO # ---------------------- # Minimum version: 1.0.0 @@ -1310,7 +1894,7 @@ AC_SUBST(MAKE_HTML) # 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], + AS_HELP_STRING([--enable-malloc0returnsnull], [malloc(0) returns NULL (default: auto)]), [MALLOC_ZERO_RETURNS_NULL=$enableval], [MALLOC_ZERO_RETURNS_NULL=auto]) @@ -1330,7 +1914,8 @@ main() { exit(m0 == 0 || r0 == 0 || c0 == 0 ? 0 : 1); }], [MALLOC_ZERO_RETURNS_NULL=yes], - [MALLOC_ZERO_RETURNS_NULL=no]) + [MALLOC_ZERO_RETURNS_NULL=no], + [MALLOC_ZERO_RETURNS_NULL=yes]) fi AC_MSG_RESULT([$MALLOC_ZERO_RETURNS_NULL]) @@ -1353,38 +1938,69 @@ AC_SUBST([XTMALLOC_ZERO_CFLAGS]) # ---------------- # 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) +# This macro enables the use of a tool that flags some suspicious and +# non-portable constructs (likely to be bugs) in C language source code. +# It will attempt to locate the tool and use appropriate options. +# There are various lint type tools on different platforms. +# +# Interface to module: +# LINT: returns the path to the tool found on the platform +# or the value set to LINT on the configure cmd line +# also an Automake conditional +# LINT_FLAGS: an Automake variable with appropriate flags +# +# --with-lint: 'yes' user instructs the module to use lint +# 'no' user instructs the module not to use lint (default) +# +# If the user sets the value of LINT, AC_PATH_PROG skips testing the path. +# If the user sets the value of LINT_FLAGS, they are used verbatim. # AC_DEFUN([XORG_WITH_LINT],[ -# Allow checking code with lint, sparse, etc. -AC_ARG_WITH(lint, [AC_HELP_STRING([--with-lint], +AC_ARG_VAR([LINT], [Path to a lint-style command]) +AC_ARG_VAR([LINT_FLAGS], [Flags for the lint-style command]) +AC_ARG_WITH(lint, [AS_HELP_STRING([--with-lint], [Use a lint-style source code checker (default: disabled)])], [use_lint=$withval], [use_lint=no]) -if test "x$use_lint" = "xyes" ; then - LINT="lint" + +# Obtain platform specific info like program name and options +# The lint program on FreeBSD and NetBSD is different from the one on Solaris +case $host_os in + *linux* | *openbsd* | kfreebsd*-gnu | darwin* | cygwin*) + lint_name=splint + lint_options="-badflag" + ;; + *freebsd* | *netbsd*) + lint_name=lint + lint_options="-u -b" + ;; + *solaris*) + lint_name=lint + lint_options="-u -b -h -erroff=E_INDISTING_FROM_TRUNC2" + ;; +esac + +# Test for the presence of the program (either guessed by the code or spelled out by the user) +if test "x$use_lint" = x"yes" ; then + AC_PATH_PROG([LINT], [$lint_name]) + if test "x$LINT" = "x"; then + AC_MSG_ERROR([--with-lint=yes specified but lint-style tool not found in PATH]) + fi +elif test "x$use_lint" = x"no" ; then + if test "x$LINT" != "x"; then + AC_MSG_WARN([ignoring LINT environment variable since --with-lint=no was specified]) + fi else - LINT="$use_lint" + AC_MSG_ERROR([--with-lint expects 'yes' or 'no'. Use LINT variable to specify path.]) 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 + +# User supplied flags override default flags +if test "x$LINT_FLAGS" != "x"; then + lint_options=$LINT_FLAGS fi -AC_SUBST(LINT) -AC_SUBST(LINT_FLAGS) -AM_CONDITIONAL(LINT, [test x$LINT != xno]) +AC_SUBST([LINT_FLAGS],[$lint_options]) +AM_CONDITIONAL(LINT, [test "x$LINT" != x]) ]) # XORG_WITH_LINT @@ -1394,33 +2010,123 @@ AM_CONDITIONAL(LINT, [test x$LINT != xno]) # # 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 # +# Interface to module: +# LINTLIB - Automake variable with the name of lint library file to make +# MAKE_LINT_LIB - Automake conditional +# +# --enable-lint-library: - 'yes' user instructs the module to created a lint library +# - 'no' user instructs the module not to create a lint library (default) AC_DEFUN([XORG_LINT_LIBRARY],[ AC_REQUIRE([XORG_WITH_LINT]) -# Build lint "library" for more indepth checks of programs calling this library -AC_ARG_ENABLE(lint-library, [AC_HELP_STRING([--enable-lint-library], +AC_ARG_ENABLE(lint-library, [AS_HELP_STRING([--enable-lint-library], [Create lint library (default: disabled)])], [make_lint_lib=$enableval], [make_lint_lib=no]) -if test "x$make_lint_lib" != "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 + +if test "x$make_lint_lib" = x"yes" ; then + LINTLIB=llib-l$1.ln + if test "x$LINT" = "x"; then + AC_MSG_ERROR([Cannot make lint library without --with-lint]) + fi +elif test "x$make_lint_lib" != x"no" ; then + AC_MSG_ERROR([--enable-lint-library expects 'yes' or 'no'.]) fi + AC_SUBST(LINTLIB) AM_CONDITIONAL(MAKE_LINT_LIB, [test x$make_lint_lib != xno]) ]) # XORG_LINT_LIBRARY +# XORG_CWARNFLAGS +# --------------- +# Minimum version: 1.2.0 +# +# Defines CWARNFLAGS to enable C compiler warnings. +# +AC_DEFUN([XORG_CWARNFLAGS], [ +AC_REQUIRE([AC_PROG_CC_C99]) +if test "x$GCC" = xyes ; then + CWARNFLAGS="-Wall -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes \ +-Wmissing-declarations -Wnested-externs -fno-strict-aliasing \ +-Wbad-function-cast -Wformat=2" + case `$CC -dumpversion` in + 3.4.* | 4.*) + CWARNFLAGS="$CWARNFLAGS -Wold-style-definition -Wdeclaration-after-statement" + ;; + esac +else + AC_CHECK_DECL([__SUNPRO_C], [SUNCC="yes"], [SUNCC="no"]) + if test "x$SUNCC" = "xyes"; then + CWARNFLAGS="-v" + fi +fi +AC_SUBST(CWARNFLAGS) +]) # XORG_CWARNFLAGS + +# XORG_STRICT_OPTION +# ----------------------- +# Minimum version: 1.3.0 +# +# Add configure option to enable strict compilation +AC_DEFUN([XORG_STRICT_OPTION], [ +# If the module's configure.ac calls AC_PROG_CC later on, CC gets set to C89 +AC_REQUIRE([AC_PROG_CC_C99]) +AC_REQUIRE([XORG_CWARNFLAGS]) + +AC_ARG_ENABLE(strict-compilation, + AS_HELP_STRING([--enable-strict-compilation], + [Enable all warnings from compiler and make them errors (default: disabled)]), + [STRICT_COMPILE=$enableval], [STRICT_COMPILE=no]) +if test "x$STRICT_COMPILE" = "xyes"; then + AC_CHECK_DECL([__SUNPRO_C], [SUNCC="yes"], [SUNCC="no"]) + AC_CHECK_DECL([__INTEL_COMPILER], [INTELCC="yes"], [INTELCC="no"]) + if test "x$GCC" = xyes ; then + STRICT_CFLAGS="-pedantic -Werror" + elif test "x$SUNCC" = "xyes"; then + STRICT_CFLAGS="-errwarn" + elif test "x$INTELCC" = "xyes"; then + STRICT_CFLAGS="-Werror" + fi +fi +CWARNFLAGS="$CWARNFLAGS $STRICT_CFLAGS" +AC_SUBST([CWARNFLAGS]) +]) # XORG_STRICT_OPTION + +# XORG_DEFAULT_OPTIONS +# -------------------- +# Minimum version: 1.3.0 +# +# Defines default options for X.Org modules. +# +AC_DEFUN([XORG_DEFAULT_OPTIONS], [ +AC_REQUIRE([AC_PROG_INSTALL]) +XORG_CWARNFLAGS +XORG_STRICT_OPTION +XORG_RELEASE_VERSION +XORG_CHANGELOG +XORG_INSTALL +XORG_MANPAGE_SECTIONS +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])], + [AC_SUBST([AM_DEFAULT_VERBOSITY], [1])]) +]) # XORG_DEFAULT_OPTIONS + +# XORG_INSTALL() +# ---------------- +# Minimum version: 1.4.0 +# +# Defines the variable INSTALL_CMD as the command to copy +# INSTALL from $prefix/share/util-macros. +# +AC_DEFUN([XORG_INSTALL], [ +AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +macros_datadir=`$PKG_CONFIG --print-errors --variable=pkgdatadir xorg-macros` +INSTALL_CMD="(cp -f "$macros_datadir/INSTALL" \$(top_srcdir)/.INSTALL.tmp && \ +mv \$(top_srcdir)/.INSTALL.tmp \$(top_srcdir)/INSTALL) \ +|| (rm -f \$(top_srcdir)/.INSTALL.tmp; touch \$(top_srcdir)/INSTALL; \ +echo 'util-macros \"pkgdatadir\" from xorg-macros.pc not found: installing possibly empty INSTALL.' >&2)" +AC_SUBST([INSTALL_CMD]) +]) # XORG_INSTALL dnl Copyright 2005 Red Hat, Inc dnl dnl Permission to use, copy, modify, distribute, and sell this software and its @@ -1448,22 +2154,9 @@ 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. +# 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]) @@ -1483,3 +2176,19 @@ AC_DEFUN([XORG_RELEASE_VERSION],[ [Patch version of this package]) ]) +# XORG_CHANGELOG() +# ---------------- +# Minimum version: 1.2.0 +# +# Defines the variable CHANGELOG_CMD as the command to generate +# ChangeLog from git. +# +# +AC_DEFUN([XORG_CHANGELOG], [ +CHANGELOG_CMD="(GIT_DIR=\$(top_srcdir)/.git git log > \$(top_srcdir)/.changelog.tmp && \ +mv \$(top_srcdir)/.changelog.tmp \$(top_srcdir)/ChangeLog) \ +|| (rm -f \$(top_srcdir)/.changelog.tmp; touch \$(top_srcdir)/ChangeLog; \ +echo 'git directory not found: installing possibly empty changelog.' >&2)" +AC_SUBST([CHANGELOG_CMD]) +]) # XORG_CHANGELOG + diff --git a/app/xkbcomp/action.c b/app/xkbcomp/action.c index 8b0ba6507..3b82e647e 100644 --- a/app/xkbcomp/action.c +++ b/app/xkbcomp/action.c @@ -1,4 +1,3 @@ -/* $Xorg: action.c,v 1.3 2000/08/17 19:54:30 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,7 +23,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. ********************************************************/ -/* $XFree86: xc/programs/xkbcomp/action.c,v 3.10tsi Exp $ */ #include "xkbcomp.h" #include "tokens.h" @@ -36,148 +34,262 @@ #include "action.h" #include "misc.h" -static Bool actionsInitialized; -static ExprDef constTrue; -static ExprDef constFalse; +static Bool actionsInitialized; +static ExprDef constTrue; +static ExprDef constFalse; /***====================================================================***/ static Bool -stringToAction(char *str,unsigned *type_rtrn) +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; + 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) +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; + 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; + 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; } @@ -187,28 +299,26 @@ static char buf[32]; static Bool ReportMismatch(unsigned action, unsigned field, const char *type) { - ERROR2("Value of %s field must be of type %s\n",fieldText(field),type); + ERROR2("Value of %s field must be of type %s\n", fieldText(field), type); ACTION1("Action %s definition ignored\n", - XkbActionTypeText(action,XkbMessage)); + XkbActionTypeText(action, XkbMessage)); return False; } static Bool -ReportIllegal(unsigned action,unsigned field) +ReportIllegal(unsigned action, unsigned field) { ERROR2("Field %s is not defined for an action of type %s\n", - fieldText(field), - XkbActionTypeText(action,XkbMessage)); + fieldText(field), XkbActionTypeText(action, XkbMessage)); ACTION("Action definition ignored\n"); return False; } static Bool -ReportActionNotArray(unsigned action,unsigned field) +ReportActionNotArray(unsigned action, unsigned field) { ERROR2("The %s field in the %s action is not an array\n", - fieldText(field), - XkbActionTypeText(action,XkbMessage)); + fieldText(field), XkbActionTypeText(action, XkbMessage)); ACTION("Action definition ignored\n"); return False; } @@ -216,1014 +326,1120 @@ ReportActionNotArray(unsigned action,unsigned field) 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)); + 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) +HandleNoAction(XkbDescPtr xkb, + XkbAnyAction * action, + unsigned field, ExprDef * array_ndx, ExprDef * value) { - return ReportIllegal(action->type,field); + return ReportIllegal(action->type, field); } static Bool -CheckLatchLockFlags( unsigned action, - unsigned field, - ExprDef * value, - unsigned * flags_inout) +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; + 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) +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; - } + 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; + 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) +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); - } + 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; + 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); + return ReportIllegal(action->type, field); } static Bool -HandleLockMods( XkbDescPtr xkb, - XkbAnyAction * action, - unsigned field, - ExprDef * array_ndx, - ExprDef * value) +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; + 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); + 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 }, + {"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) +CheckGroupField(unsigned action, + ExprDef * value, unsigned *flags_inout, int *grp_rtrn) { -ExprDef * spec; -ExprResult rtrn; + ExprDef *spec; + ExprResult rtrn; - if ((value->op==OpNegate)||(value->op==OpUnaryPlus)) { - *flags_inout&= ~XkbSA_GroupAbsolute; - spec= value->value.child; + if ((value->op == OpNegate) || (value->op == OpUnaryPlus)) + { + *flags_inout &= ~XkbSA_GroupAbsolute; + spec = value->value.child; } - else { - *flags_inout|= XkbSA_GroupAbsolute; - spec= value; + 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 (!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; + 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) +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); - } + 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; + 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); + return ReportIllegal(action->type, field); } static Bool -HandleLockGroup( XkbDescPtr xkb, - XkbAnyAction * action, - unsigned field, - ExprDef * array_ndx, - ExprDef * value) +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; + 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); + return ReportIllegal(action->type, field); } static Bool -HandleMovePtr( XkbDescPtr xkb, - XkbAnyAction * action, - unsigned field, - ExprDef * array_ndx, - ExprDef * value) +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; + 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; + 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); + return ReportIllegal(action->type, field); } static LookupEntry btnNames[] = { - { "button1", 1 }, - { "button2", 2 }, - { "button3", 3 }, - { "button4", 4 }, - { "button5", 5 }, - { "default", 0 }, - { NULL, 0 } + {"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 } + {"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) +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; + 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 ((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; + 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); + return ReportIllegal(action->type, field); } static LookupEntry ptrDflts[] = { - { "dfltbtn", XkbSA_AffectDfltBtn }, - { "defaultbutton", XkbSA_AffectDfltBtn }, - { "button", XkbSA_AffectDfltBtn }, - { NULL, 0 } + {"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) +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; + 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; + 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); + 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 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) +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; + 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); + return ReportIllegal(action->type, field); } static Bool -HandleSwitchScreen( XkbDescPtr xkb, - XkbAnyAction * action, - unsigned field, - ExprDef * array_ndx, - ExprDef * value) +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; + 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; + 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); + 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 } +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) +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; + 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); + 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 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) +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; + 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); + return ReportIllegal(action->type, field); } static Bool -HandleRedirectKey( XkbDescPtr xkb, - XkbAnyAction * action, - unsigned field, - ExprDef * array_ndx, - ExprDef * value) +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; + 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); + return ReportIllegal(action->type, field); } static Bool -HandleDeviceBtn( XkbDescPtr xkb, - XkbAnyAction * action, - unsigned field, - ExprDef * array_ndx, - ExprDef * value) +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; + 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 ((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_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; + 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); + return ReportIllegal(action->type, field); } static Bool -HandleDeviceValuator( XkbDescPtr xkb, - XkbAnyAction * action, - unsigned field, - ExprDef * array_ndx, - ExprDef * value) +HandleDeviceValuator(XkbDescPtr xkb, + XkbAnyAction * action, + unsigned field, ExprDef * array_ndx, ExprDef * value) { #if 0 -ExprResult rtrn; -XkbDeviceValuatorAction * act; + ExprResult rtrn; + XkbDeviceValuatorAction *act; - act= (XkbDeviceValuatorAction *)action; + act = (XkbDeviceValuatorAction *) action; /* XXX - Not yet implemented */ #endif return False; } static Bool -HandlePrivate( XkbDescPtr xkb, - XkbAnyAction * action, - unsigned field, - ExprDef * array_ndx, - ExprDef * value) +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; - } + 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); + 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 */ +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) +ApplyActionFactoryDefaults(XkbAction * action) { - if (action->type==XkbSA_SetPtrDflt) { /* increment default button */ - action->dflt.affect= XkbSA_AffectDfltBtn; - action->dflt.flags= 0; - XkbSASetPtrDfltValue(&action->dflt,1); + 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; + else if (action->type == XkbSA_ISOLock) + { + action->iso.real_mods = LockMask; } return; } -int -HandleActionDef( ExprDef * def, - XkbDescPtr xkb, - XkbAnyAction * action, - unsigned mergeMode, - ActionInfo * info) +int +HandleActionDef(ExprDef * def, + XkbDescPtr xkb, + XkbAnyAction * action, unsigned mergeMode, ActionInfo * info) { -ExprDef * arg; -register char * str; -unsigned tmp,hndlrType; + ExprDef *arg; + register char *str; + unsigned tmp, hndlrType; if (!actionsInitialized) - ActionsInit(); + ActionsInit(); - if (def->op!=ExprActionDecl) { - ERROR1("Expected an action definition, found %s\n",exprOpText(def->op)); - return False; + 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; + 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; + 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; - } + 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; - } + 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) +int +SetActionField(XkbDescPtr xkb, + char *elem, + char *field, + ExprDef * array_ndx, ExprDef * value, ActionInfo ** info_rtrn) { -ActionInfo *new,*old; + ActionInfo *new, *old; if (!actionsInitialized) - ActionsInit(); + ActionsInit(); - new= uTypedAlloc(ActionInfo); - if (new==NULL) { - WSGO("Couldn't allocate space for action default\n"); - return False; + 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 (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; + 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; + 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; } @@ -1232,21 +1448,21 @@ ActionInfo *new,*old; 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; + 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/app/xkbcomp/action.h b/app/xkbcomp/action.h index 4a1166420..2fb7a5eb9 100644 --- a/app/xkbcomp/action.h +++ b/app/xkbcomp/action.h @@ -1,4 +1,3 @@ -/* $Xorg: action.h,v 1.3 2000/08/17 19:54:30 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,7 +23,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. ********************************************************/ -/* $XFree86$ */ #ifndef ACTION_H #define ACTION_H 1 @@ -57,34 +55,31 @@ #define PrivateAction (XkbSA_LastAction+1) -typedef struct _ActionInfo { - unsigned action; - unsigned field; - ExprDef * array_ndx; - ExprDef * value; - struct _ActionInfo * next; +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 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 int SetActionField(XkbDescPtr /* xkb */ , + char * /* elem */ , + char * /* field */ , + ExprDef * /* index */ , + ExprDef * /* value */ , + ActionInfo ** /* info_rtrn */ + ); -extern void ActionsInit( - void -); +extern void ActionsInit(void); extern LookupEntry ctrlNames[]; diff --git a/app/xkbcomp/alias.c b/app/xkbcomp/alias.c index f228b0d66..ba55d3d32 100644 --- a/app/xkbcomp/alias.c +++ b/app/xkbcomp/alias.c @@ -1,4 +1,3 @@ -/* $Xorg: alias.c,v 1.3 2000/08/17 19:54:30 cpqbld Exp $ */ /************************************************************ Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc. @@ -24,7 +23,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. ********************************************************/ -/* $XFree86$ */ #include "xkbcomp.h" #include "misc.h" @@ -34,228 +32,258 @@ #include <X11/extensions/XKBgeom.h> static void -HandleCollision(AliasInfo *old,AliasInfo *new) +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"); - } + 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); + 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; + 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) +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); + 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) +int +HandleAliasDef(KeyAliasDef * def, + unsigned merge, unsigned file_id, AliasInfo ** info_in) { -AliasInfo * info; + 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; - } + 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 = 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); + 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) +ClearAliases(AliasInfo ** info_in) { - if ((info_in)&&(*info_in)) - ClearCommonInfo(&(*info_in)->def); + if ((info_in) && (*info_in)) + ClearCommonInfo(&(*info_in)->def); return; } Bool -MergeAliases(AliasInfo **into,AliasInfo **merge,unsigned how_merge) +MergeAliases(AliasInfo ** into, AliasInfo ** merge, unsigned how_merge) { -AliasInfo * tmp; -KeyAliasDef def; + 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; + 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) +ApplyAliases(XkbDescPtr xkb, Bool toGeom, AliasInfo ** info_in) { -register int i; -XkbKeyAliasPtr old,a; -AliasInfo * info; -int nNew,nOld; -Status status; + 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); + 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); + 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; + 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; - } - } - } + 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; + 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; + 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; + 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 (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++; - } + 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); + 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; + if (toGeom) + xkb->geom->num_key_aliases += nNew; ClearCommonInfo(&(*info_in)->def); - *info_in= NULL; + *info_in = NULL; return True; } diff --git a/app/xkbcomp/alias.h b/app/xkbcomp/alias.h index fd0338847..b6fac5bfa 100644 --- a/app/xkbcomp/alias.h +++ b/app/xkbcomp/alias.h @@ -1,4 +1,3 @@ -/* $Xorg: alias.h,v 1.3 2000/08/17 19:54:30 cpqbld Exp $ */ /************************************************************ Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc. @@ -24,38 +23,34 @@ 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]; +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 */ -); +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/app/xkbcomp/compat.c b/app/xkbcomp/compat.c index 00eb72b81..03c29efdc 100644 --- a/app/xkbcomp/compat.c +++ b/app/xkbcomp/compat.c @@ -1,4 +1,3 @@ -/* $Xorg: compat.c,v 1.3 2000/08/17 19:54:30 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,7 +23,6 @@ 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" @@ -34,10 +32,12 @@ #include "misc.h" #include "indicators.h" #include "action.h" +#include "compat.h" -typedef struct _SymInterpInfo { - CommonInfo defs; - XkbSymInterpretRec interp; +typedef struct _SymInterpInfo +{ + CommonInfo defs; + XkbSymInterpretRec interp; } SymInterpInfo; #define _SI_VirtualMod (1<<0) @@ -46,26 +46,28 @@ typedef struct _SymInterpInfo { #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; +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; +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; /***====================================================================***/ @@ -78,234 +80,265 @@ typedef struct _CompatInfo { /***====================================================================***/ static char * -siText(SymInterpInfo * si,CompatInfo * info) +siText(SymInterpInfo * si, CompatInfo * info) { -static char buf[128]; + static char buf[128]; - if (si==&info->dflt) { - sprintf(buf,"default"); + if (si == &info->dflt) + { + snprintf(buf, sizeof(buf), "default"); } - else { - sprintf(buf,"%s+%s(%s)",XkbKeysymText(si->interp.sym,XkbMessage), - XkbSIMatchText(si->interp.match,XkbMessage), - XkbModMaskText(si->interp.mods,XkbMessage)); + else + { + snprintf(buf, sizeof(buf), "%s+%s(%s)", + XkbKeysymText(si->interp.sym, XkbMessage), + XkbSIMatchText(si->interp.match, XkbMessage), + XkbModMaskText(si->interp.mods, XkbMessage)); } return buf; } static void -InitCompatInfo(CompatInfo *info,XkbDescPtr xkb) +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); + 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) +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); + 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); + ClearVModInfo(&info->vmods, xkb); return; } static SymInterpInfo * -NextInterp(CompatInfo *info) +NextInterp(CompatInfo * info) { -SymInterpInfo * si; + SymInterpInfo *si; - si= uTypedAlloc(SymInterpInfo); - if (si) { - bzero((char *)si,sizeof(SymInterpInfo)); - info->interps= (SymInterpInfo *)AddCommonInfo(&info->interps->defs, - (CommonInfo *)si); - info->nInterps++; + 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) +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; - } + 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) +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; + 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) +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; + 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) +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; + 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; } @@ -313,468 +346,535 @@ ExprResult result; /***====================================================================***/ static void -MergeIncludedCompatMaps( CompatInfo * into, - CompatInfo * from, - unsigned merge) +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++; + 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 */ -); +typedef void (*FileHandler) (XkbFile * /* rtrn */ , + XkbDescPtr /* xkb */ , + unsigned /* merge */ , + CompatInfo * /* info */ + ); static Bool -HandleIncludeCompatMap( IncludeStmt * stmt, - XkbDescPtr xkb, - CompatInfo * info, - FileHandler hndlr) +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; - } - } + 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); + *info = included; + else + { + MergeIncludedCompatMaps(info, &included, newMerge); + ClearCompatInfo(&included, xkb); } - return (info->errorCount==0); + return (info->errorCount == 0); } static LookupEntry useModMapValues[] = { - { "levelone", 1 }, - { "level1", 1 }, - { "anylevel", 0 }, - { "any", 0 }, - { NULL, 0 } + {"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) +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)); + 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 } +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) +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); + 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) +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); + 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) +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; + 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) +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); + 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) +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) { + 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"); + ERROR("Too many errors\n"); #endif - ACTION1("Abandoning compatibility map \"%s\"\n",file->topName); - break; - } + ACTION1("Abandoning compatibility map \"%s\"\n", file->topName); + break; + } } return; } static void -CopyInterps( CompatInfo * info, - XkbCompatMapPtr compat, - Bool needSymbol, - unsigned pred) +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; + 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) +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); + 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/app/xkbcomp/compat.h b/app/xkbcomp/compat.h index 4edf78879..799b215ee 100644 --- a/app/xkbcomp/compat.h +++ b/app/xkbcomp/compat.h @@ -1,4 +1,3 @@ -/* $XFree86$ */ #ifndef COMPAT_H #define COMPAT_H 1 diff --git a/app/xkbcomp/config.h.in b/app/xkbcomp/config.h.in index 1ca40928b..b0cfb7241 100644 --- a/app/xkbcomp/config.h.in +++ b/app/xkbcomp/config.h.in @@ -1,5 +1,38 @@ /* config.h.in. Generated from configure.ac by autoheader. */ +/* Define to 1 if you have the <inttypes.h> header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the <memory.h> header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the <stdint.h> header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the <stdlib.h> header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strcasecmp' function. */ +#undef HAVE_STRCASECMP + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the <strings.h> header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the <string.h> header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the <sys/types.h> header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the <unistd.h> header file. */ +#undef HAVE_UNISTD_H + /* Name of package */ #undef PACKAGE @@ -27,5 +60,8 @@ /* Patch version of this package */ #undef PACKAGE_VERSION_PATCHLEVEL +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + /* Version number of package */ #undef VERSION diff --git a/app/xkbcomp/configure b/app/xkbcomp/configure index 28bd093e0..833d445d8 100644 --- a/app/xkbcomp/configure +++ b/app/xkbcomp/configure @@ -1,27 +1,84 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.59 for xkbcomp 1.0.5. +# Generated by GNU Autoconf 2.62 for xkbcomp 1.2.0. # # Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg>. # -# Copyright (C) 2003 Free Software Foundation, Inc. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 Bourne compatible +# 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 + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix + 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 + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } fi -DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then @@ -31,33 +88,60 @@ else fi +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + # Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH +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 - fi -done +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE # Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then +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 +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false @@ -65,157 +149,391 @@ fi # Name of the executable. -as_me=`$as_basename "$0" || +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'` + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH -# PATH needs CR, and LINENO needs CR and PATH. -# 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 +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi -# 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 + 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 - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - 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 +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi - ;; - 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_me: error: cannot find myself; rerun with an absolute path" >&2 - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') +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=. - for as_base in sh bash ksh sh5; do - case $as_dir in + case $as_dir in /*) - if ("$as_dir/$as_base" -c ' + 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=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +_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=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; +esac + +fi + + +: +(as_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 - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac + 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 bug-autoconf@gnu.org about your system, + echo including any error possibly output before this message. + echo This can help us improve future autoconf versions. + echo Configuration will now proceed without shell functions. +} + + + + 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 before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. + # 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 - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | + # 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 - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop - s,-$,, - s,^['$as_cr_digits']*\n,, + 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 + chmod +x "$as_me.lineno" || + { $as_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 sensible to this). - . ./$as_me.lineno + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" # Exit status is that of the last command. exit } -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; -esac +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -if expr a : '\(a\)' >/dev/null 2>&1; then +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 -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links - as_ln_s='cp -p' - else +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' fi -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$$.file +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=: @@ -224,7 +542,28 @@ else as_mkdir_p=false fi -as_executable_p="test -f" +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'" @@ -233,52 +572,215 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH +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` -exec 6>&1 - # # 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} -# Maximum number of lines to put in a shell here document. -# This variable seems obsolete. It should probably be removed, and -# only ac_max_sed_lines should be used. -: ${ac_max_here_lines=38} - # Identity of this package. PACKAGE_NAME='xkbcomp' PACKAGE_TARNAME='xkbcomp' -PACKAGE_VERSION='1.0.5' -PACKAGE_STRING='xkbcomp 1.0.5' +PACKAGE_VERSION='1.2.0' +PACKAGE_STRING='xkbcomp 1.2.0' 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 datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_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 PKG_CONFIG ac_pt_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' +# Factoring default headers for most tests. +ac_includes_default="\ +#include <stdio.h> +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif +#ifdef HAVE_SYS_STAT_H +# include <sys/stat.h> +#endif +#ifdef STDC_HEADERS +# include <stdlib.h> +# include <stddef.h> +#else +# ifdef HAVE_STDLIB_H +# include <stdlib.h> +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include <memory.h> +# endif +# include <string.h> +#endif +#ifdef HAVE_STRINGS_H +# include <strings.h> +#endif +#ifdef HAVE_INTTYPES_H +# include <inttypes.h> +#endif +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif" + +ac_subst_vars='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 +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 +CPP +GREP +EGREP +CWARNFLAGS +CHANGELOG_CMD +PKG_CONFIG +INSTALL_CMD +build +build_cpu +build_vendor +build_os +host +host_cpu +host_vendor +host_os +SED +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 +XORG_MAN_PAGE +MAN_SUBSTS +AM_DEFAULT_VERBOSITY +YACC +YFLAGS +YACC_INST +XKBCOMP_CFLAGS +XKBCOMP_LIBS +XKBCONFIGROOT +LIBOBJS +LTLIBOBJS' ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_maintainer_mode +enable_dependency_tracking +enable_strict_compilation +with_xkb_config_root +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +PKG_CONFIG +YACC +YFLAGS +XKBCOMP_CFLAGS +XKBCOMP_LIBS' + # Initialize some variables set by options. ac_init_help= ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null @@ -301,34 +803,48 @@ x_libraries=NONE # 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' -datadir='${prefix}/share' +datarootdir='${prefix}/share' +datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' +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" + eval $ac_prev=\$ac_option ac_prev= continue fi - ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + 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_option in + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; @@ -350,33 +866,61 @@ do --config-cache | -C) cache_file=config.cache ;; - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) + -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-\(.*\)'` + ac_useropt=`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 + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/-/_/g'` - eval "enable_$ac_feature=no" ;; + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; -enable-* | --enable-*) - ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + ac_useropt=`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 + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; esac - eval "enable_$ac_feature='$ac_optarg'" ;; + eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ @@ -403,6 +947,12 @@ do -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 ;; @@ -427,13 +977,16 @@ do | --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 | --local | --loca | --loc | --lo) + | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) @@ -498,6 +1051,16 @@ do | --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 ;; @@ -548,26 +1111,38 @@ do ac_init_version=: ;; -with-* | --with-*) - ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + ac_useropt=`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 + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 { (exit 1); exit 1; }; } - ac_package=`echo $ac_package| sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; esac - eval "with_$ac_package='$ac_optarg'" ;; + eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) - ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + ac_useropt=`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 + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 { (exit 1); exit 1; }; } - ac_package=`echo $ac_package | sed 's/-/_/g'` - eval "with_$ac_package=no" ;; + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. @@ -587,7 +1162,7 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) { echo "$as_me: error: unrecognized option: $ac_option + -*) { $as_echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; @@ -596,17 +1171,16 @@ Try \`$0 --help' for more information." >&2 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 + { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } - ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` - eval "$ac_envvar='$ac_optarg'" + 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 + $as_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 + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; @@ -615,31 +1189,39 @@ 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 + { $as_echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi -# Be sure to have absolute paths. -for ac_var in exec_prefix prefix -do - eval ac_val=$`echo $ac_var` - case $ac_val in - [\\/$]* | ?:[\\/]* | NONE | '' ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) { $as_echo "$as_me: error: Unrecognized options: $ac_unrecognized_opts" >&2 + { (exit 1); exit 1; }; } ;; + *) $as_echo "$as_me: WARNING: Unrecognized options: $ac_unrecognized_opts" >&2 ;; esac -done +fi -# Be sure to have absolute paths. -for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ - localstatedir libdir includedir oldincludedir infodir mandir +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir do - eval ac_val=$`echo $ac_var` + eval ac_val=\$$ac_var + # Remove trailing slashes. case $ac_val in - [\\/$]* | ?:[\\/]* ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac + { $as_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' @@ -653,7 +1235,7 @@ target=$target_alias 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. + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes @@ -666,82 +1248,76 @@ test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + { $as_echo "$as_me: error: Working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { $as_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 its parent. - ac_confdir=`(dirname "$0") 2>/dev/null || -$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'` + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then + if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 - { (exit 1); exit 1; }; } - else - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } - fi fi -(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || - { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } -srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` -ac_env_build_alias_set=${build_alias+set} -ac_env_build_alias_value=$build_alias -ac_cv_env_build_alias_set=${build_alias+set} -ac_cv_env_build_alias_value=$build_alias -ac_env_host_alias_set=${host_alias+set} -ac_env_host_alias_value=$host_alias -ac_cv_env_host_alias_set=${host_alias+set} -ac_cv_env_host_alias_value=$host_alias -ac_env_target_alias_set=${target_alias+set} -ac_env_target_alias_value=$target_alias -ac_cv_env_target_alias_set=${target_alias+set} -ac_cv_env_target_alias_value=$target_alias -ac_env_CC_set=${CC+set} -ac_env_CC_value=$CC -ac_cv_env_CC_set=${CC+set} -ac_cv_env_CC_value=$CC -ac_env_CFLAGS_set=${CFLAGS+set} -ac_env_CFLAGS_value=$CFLAGS -ac_cv_env_CFLAGS_set=${CFLAGS+set} -ac_cv_env_CFLAGS_value=$CFLAGS -ac_env_LDFLAGS_set=${LDFLAGS+set} -ac_env_LDFLAGS_value=$LDFLAGS -ac_cv_env_LDFLAGS_set=${LDFLAGS+set} -ac_cv_env_LDFLAGS_value=$LDFLAGS -ac_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_env_CPPFLAGS_value=$CPPFLAGS -ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_cv_env_CPPFLAGS_value=$CPPFLAGS -ac_env_PKG_CONFIG_set=${PKG_CONFIG+set} -ac_env_PKG_CONFIG_value=$PKG_CONFIG -ac_cv_env_PKG_CONFIG_set=${PKG_CONFIG+set} -ac_cv_env_PKG_CONFIG_value=$PKG_CONFIG -ac_env_XKBCOMP_CFLAGS_set=${XKBCOMP_CFLAGS+set} -ac_env_XKBCOMP_CFLAGS_value=$XKBCOMP_CFLAGS -ac_cv_env_XKBCOMP_CFLAGS_set=${XKBCOMP_CFLAGS+set} -ac_cv_env_XKBCOMP_CFLAGS_value=$XKBCOMP_CFLAGS -ac_env_XKBCOMP_LIBS_set=${XKBCOMP_LIBS+set} -ac_env_XKBCOMP_LIBS_value=$XKBCOMP_LIBS -ac_cv_env_XKBCOMP_LIBS_set=${XKBCOMP_LIBS+set} -ac_cv_env_XKBCOMP_LIBS_value=$XKBCOMP_LIBS + 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. @@ -750,7 +1326,7 @@ 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. +\`configure' configures xkbcomp 1.2.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -770,14 +1346,11 @@ Configuration: -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] -_ACEOF - - cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] + [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] + [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify @@ -787,18 +1360,25 @@ 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] - --datadir=DIR read-only architecture-independent data [PREFIX/share] - --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] - --infodir=DIR info documentation [PREFIX/info] - --mandir=DIR man documentation [PREFIX/man] + --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 @@ -816,32 +1396,44 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of xkbcomp 1.0.5:";; + short | recursive ) echo "Configuration of xkbcomp 1.2.0:";; esac cat <<\_ACEOF Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors + --enable-strict-compilation + Enable all warnings from compiler and make them + errors (default: disabled) 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 + --with-xkb-config-root=<paths> + Set default XKB config root (default: + ${datadir}/X11/xkb) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir> - CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have - headers in a nonstandard directory <include 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> + CPP C preprocessor PKG_CONFIG path to pkg-config utility + 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. XKBCOMP_CFLAGS C compiler flags for XKBCOMP, overriding pkg-config XKBCOMP_LIBS @@ -852,120 +1444,88 @@ 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. - ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d $ac_dir || continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue ac_builddir=. -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix case $srcdir in - .) # No --srcdir option. We are building in place. + .) # We are building in place. ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. + 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 ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac - -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; + 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 - - cd $ac_dir - # Check for guested configure; otherwise get Cygnus style 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 - elif test -f $ac_srcdir/configure.ac || - test -f $ac_srcdir/configure.in; then - echo - $ac_configure --help +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 - cd $ac_popdir + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } done fi -test -n "$ac_init_help" && exit 0 +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.59 +xkbcomp configure 1.2.0 +generated by GNU Autoconf 2.62 -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 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 0 + exit fi -exec 5>config.log -cat >&5 <<_ACEOF +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.59. Invocation command line was +It was created by xkbcomp $as_me 1.2.0, which was +generated by GNU Autoconf 2.62. Invocation command line was $ $0 $@ _ACEOF +exec 5>>config.log { cat <<_ASUNAME ## --------- ## @@ -984,7 +1544,7 @@ uname -v = `(uname -v) 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` -hostinfo = `(hostinfo) 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` @@ -996,8 +1556,9 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - echo "PATH: $as_dir" + $as_echo "PATH: $as_dir" done +IFS=$as_save_IFS } >&5 @@ -1019,7 +1580,6 @@ _ACEOF ac_configure_args= ac_configure_args0= ac_configure_args1= -ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do @@ -1030,8 +1590,8 @@ do -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; @@ -1052,9 +1612,7 @@ do -* ) ac_must_keep_next=true ;; esac fi - ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" - # Get rid of the leading space. - ac_sep=" " + ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done @@ -1065,8 +1623,8 @@ $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_ # 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: Be sure not to use single quotes in there, as some shells, -# such as our DU 5.0 friend, will then `close' the trap. +# 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. { @@ -1079,20 +1637,35 @@ trap 'exit_status=$? _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_*) { $as_echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +$as_echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done (set) 2>&1 | - case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in - *ac_space=\ *) + 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" - ;; + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( *) - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; - esac; -} + esac | + sort +) echo cat <<\_ASBOX @@ -1103,22 +1676,28 @@ _ASBOX echo for ac_var in $ac_subst_vars do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX -## ------------- ## -## Output files. ## -## ------------- ## +## ------------------- ## +## File substitutions. ## +## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi @@ -1130,26 +1709,24 @@ _ASBOX ## ----------- ## _ASBOX echo - sed "/^$/d" confdefs.h | sort + cat confdefs.h echo fi test "$ac_signal" != 0 && - echo "$as_me: caught signal $ac_signal" - echo "$as_me: exit $exit_status" + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" } >&5 - rm -f core *.core && - rm -rf conftest* confdefs* conf$$* $ac_clean_files && + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status - ' 0 +' 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 -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo >confdefs.h +rm -f -r conftest* confdefs.h # Predefined preprocessor variables. @@ -1179,18 +1756,24 @@ _ACEOF # Let the site file select an alternate cache file if it wants to. -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site fi -for ac_site_file in $CONFIG_SITE; do +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue 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;} + { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi @@ -1200,54 +1783,61 @@ 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;} + { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in - [\\/]* | ?:[\\/]* ) . $cache_file;; - *) . ./$cache_file;; + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; esac fi else - { echo "$as_me:$LINENO: creating cache $cache_file" >&5 -echo "$as_me: creating cache $cache_file" >&6;} + { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false -for ac_var in `(set) 2>&1 | - sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do +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" + 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;} + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { 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;} + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then - { 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=: + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in @@ -1257,19 +1847,13 @@ echo "$as_me: current value: $ac_new_val" >&2;} 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;} + { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +$as_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 - @@ -1294,33 +1878,44 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu +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.9" ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then +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 + 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 + 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;} + { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 +$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} { (exit 1); exit 1; }; } fi -ac_config_guess="$SHELL $ac_aux_dir/config.guess" -ac_config_sub="$SHELL $ac_aux_dir/config.sub" -ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# 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 @@ -1335,11 +1930,12 @@ ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # 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 +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -1358,7 +1954,7 @@ case $as_dir/ in # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + 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. @@ -1368,30 +1964,43 @@ case $as_dir/ in # 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 + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi fi fi done done ;; esac + done +IFS=$as_save_IFS +rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will + # 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 path is relative. + # 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 +{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. @@ -1402,17 +2011,14 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' test "$program_prefix" != NONE && - program_transform_name="s,^,$program_prefix,;$program_transform_name" + 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. + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. # 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 conftest.sed +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` @@ -1423,8 +2029,8 @@ 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;} + { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then @@ -1464,10 +2070,10 @@ 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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AWK+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. @@ -1478,54 +2084,58 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + 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 + $as_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 + { $as_echo "$as_me:$LINENO: result: $AWK" >&5 +$as_echo "$AWK" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` -if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF +SHELL = /bin/sh all: - @echo 'ac_maketemp="$(MAKE)"' + @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi +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 \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } SET_MAKE= else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -1541,8 +2151,8 @@ rmdir .tst 2>/dev/null # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && 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;} + { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi @@ -1558,7 +2168,7 @@ fi # Define the identity of the package. PACKAGE='xkbcomp' - VERSION='1.0.5' + VERSION='1.2.0' cat >>confdefs.h <<_ACEOF @@ -1596,10 +2206,10 @@ 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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. @@ -1610,34 +2220,36 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + 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 + $as_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 + { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. @@ -1648,27 +2260,41 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + 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 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" 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 + { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi - STRIP=$ac_ct_STRIP + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_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 +$as_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 @@ -1688,17 +2314,17 @@ 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 or --disable-maintainer-mode was given. +{ $as_echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 +$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then - enableval="$enable_maintainer_mode" - USE_MAINTAINER_MODE=$enableval + 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 +fi + + { $as_echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then @@ -1713,7 +2339,81 @@ fi - ac_config_headers="$ac_config_headers config.h" +# Require X.Org macros 1.8 or later for MAN_SUBSTS set by XORG_MANPAGE_SECTIONS + + + + + + + + + + + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# 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 + + +{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + + +if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + ac_ext=c @@ -1724,10 +2424,10 @@ 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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -1738,34 +2438,36 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + 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 + $as_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 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. @@ -1776,38 +2478,53 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + 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 + $as_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 + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_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 +$as_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. + 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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -1818,76 +2535,36 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + 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 + $as_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 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "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_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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -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 - - CC=$ac_ct_CC -else - CC="$ac_cv_prog_CC" -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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -1899,17 +2576,18 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + 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 + $as_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. @@ -1927,24 +2605,25 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then - for ac_prog in cl + 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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -1955,38 +2634,40 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + 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 + $as_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 + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi + test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC - for ac_prog in cl + 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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. @@ -1997,58 +2678,92 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + 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 + $as_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 + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi + test -n "$ac_ct_CC" && break done - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_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 +$as_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 +test -z "$CC" && { { $as_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 +$as_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` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5 - (eval $ac_compiler --version </dev/null >&5) 2>&5 +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5 - (eval $ac_compiler -v </dev/null >&5) 2>&5 +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5 - (eval $ac_compiler -V </dev/null >&5) 2>&5 +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF @@ -2067,111 +2782,146 @@ main () } _ACEOF ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.exe b.out" +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -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[^ ]*//'` -if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 - (eval $ac_link_default) 2>&5 +{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { (ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link_default") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then - # Find the output, starting from the most likely. This scheme is -# not robust to junk in `.', hence go to wildcards (a.*) only as a last -# resort. - -# Be careful to initialize this variable, since it used to be cached. -# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. -ac_cv_exeext= -# b.out is created by i960 compilers. -for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out + # 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 | *.o | *.obj ) - ;; - conftest.$ac_ext ) - # This is the source file. + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - # FIXME: I believe we export ac_cv_exeext for Libtool, - # but it would be cool to find out if it's true. Does anybody - # maintain Libtool? --akim. - export ac_cv_exeext + 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 - echo "$as_me: failed program was:" >&5 + ac_file='' +fi + +{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +if test -z "$ac_file"; then + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +{ { $as_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 +$as_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 -echo "$as_me:$LINENO: result: $ac_file" >&5 -echo "${ECHO_T}$ac_file" >&6 -# Check the compiler produces executables we can run. If not, either +# 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 +{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&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' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + $as_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. + { { $as_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. +$as_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 +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } -rm -f a.out a.exe conftest$ac_cv_exeext b.out +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -# Check the compiler produces executables we can run. If not, either +# 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 { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + $as_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 @@ -2180,32 +2930,31 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 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 | *.o | *.obj ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - export ac_cv_exeext break;; * ) break;; esac done else - { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link + { { $as_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 +$as_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 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +$as_echo "$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 +{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -2223,39 +2972,46 @@ main () } _ACEOF rm -f conftest.o conftest.obj -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then - for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + 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 ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else - echo "$as_me: failed program was:" >&5 + $as_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 +{ { $as_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 +$as_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 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +$as_echo "$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 +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -2276,50 +3032,54 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$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); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + $as_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 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_compiler_gnu=no + ac_compiler_gnu=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +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` +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -CFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF + 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 @@ -2335,38 +3095,121 @@ main () } _ACEOF rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$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); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + $as_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 + $as_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 ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_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 + $as_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 ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_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 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_prog_cc_g=no + +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 conftest.err conftest.$ac_objext conftest.$ac_ext + +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 +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then @@ -2382,12 +3225,12 @@ else CFLAGS= fi fi -echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 -echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + $as_echo_n "(cached) " >&6 else - ac_cv_prog_cc_stdc=no + ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -2421,12 +3264,17 @@ static char *f (char * (*g) (char **, int), char **p, ...) /* 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 -std1 is added to get + 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 -std1. */ + 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);}; @@ -2441,282 +3289,70 @@ return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; return 0; } _ACEOF -# Don't try gcc -ansi; that turns off useful extensions and -# breaks some systems' header files. -# AIX -qlanglvl=ansi -# Ultrix and OSF/1 -std1 -# HP-UX 10.20 and later -Ae -# HP-UX older versions -Aa -D_HPUX_SOURCE -# SVR4 -Xc -D__EXTENSIONS__ -for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +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 { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$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); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cc_stdc=$ac_arg -break + $as_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 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.err conftest.$ac_objext + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break done -rm -f conftest.$ac_ext conftest.$ac_objext +rm -f conftest.$ac_ext CC=$ac_save_CC fi - -case "x$ac_cv_prog_cc_stdc" in - x|xno) - echo "$as_me:$LINENO: result: none needed" >&5 -echo "${ECHO_T}none needed" >&6 ;; +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:$LINENO: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; *) - echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 - CC="$CC $ac_cv_prog_cc_stdc" ;; + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac -# Some people use a C++ compiler to compile C. Since we use `exit', -# in C++ we need to declare it. In case someone uses the same compiler -# for both compiling C and C++ we need to have the C++ compiler decide -# the declaration of exit, since it's the most demanding environment. -cat >conftest.$ac_ext <<_ACEOF -#ifndef __cplusplus - choke me -#endif -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - for ac_declaration in \ - '' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -#include <stdlib.h> -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -continue -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&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); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext 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 or --disable-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 +{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up @@ -2803,8 +3439,8 @@ else fi fi -echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 -echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type @@ -2820,138 +3456,838 @@ else fi -for ac_prog in 'bison -y' byacc + { $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C99" >&5 +$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } +if test "${ac_cv_prog_cc_c99+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c99=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 <stdbool.h> +#include <stdlib.h> +#include <wchar.h> +#include <stdio.h> + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +#define debug(...) fprintf (stderr, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + your preprocessor is broken; +#endif +#if BIG_OK +#else + your preprocessor is broken; +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\0'; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static void +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str; + int number; + float fnumber; + + while (*format) + { + switch (*format++) + { + case 's': // string + str = va_arg (args_copy, const char *); + break; + case 'd': // int + number = va_arg (args_copy, int); + break; + case 'f': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); +} + +int +main () +{ + + // Check bool. + _Bool success = false; + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + test_varargs ("s, d' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' + || dynamic_array[ni.number - 1] != 543); + + ; + return 0; +} +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -xc99=all -qlanglvl=extc99 do - # 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 + 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 ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$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 + $as_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_c99=$ac_arg else - if test -n "$YACC"; then - ac_cv_prog_YACC="$YACC" # Let the user override the test. + $as_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_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c99" in + x) + { $as_echo "$as_me:$LINENO: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c99" + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c99" >&5 +$as_echo "$ac_cv_prog_cc_c99" >&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 +{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + $as_echo_n "(cached) " >&6 else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$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 + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP fi -YACC=$ac_cv_prog_YACC -if test -n "$YACC"; then - echo "$as_me:$LINENO: result: $YACC" >&5 -echo "${ECHO_T}$YACC" >&6 +{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue fi - test -n "$YACC" && break +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + done -test -n "$YACC" || YACC="yacc" +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi -# 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 +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + $as_echo_n "(cached) " >&6 else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin 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 $as_executable_p "$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 + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 done - ;; + done +done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac + + $ac_path_EGREP_found && break 3 + done + done done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <float.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 ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$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 + $as_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_header_stdc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no 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. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL=$ac_install_sh - fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <string.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no fi -echo "$as_me:$LINENO: result: $INSTALL" >&5 -echo "${ECHO_T}$INSTALL" >&6 +rm -f conftest* -# 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}' +fi -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <stdlib.h> -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <ctype.h> +#include <stdlib.h> +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_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 ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$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 + $as_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 + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if test `eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done -# 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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_PKG_CONFIG+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) @@ -2964,36 +4300,37 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + 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 + $as_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 + { $as_echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) @@ -3006,28 +4343,42 @@ do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + 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 + $as_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 + { $as_echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } fi - PKG_CONFIG=$ac_pt_PKG_CONFIG + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_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 +$as_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 @@ -3035,184 +4386,433 @@ 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 + { $as_echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } PKG_CONFIG="" fi fi +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { (exit 1); exit 1; }; } -pkg_failed=no -echo "$as_me:$LINENO: checking for XKBCOMP" >&5 -echo $ECHO_N "checking for XKBCOMP... $ECHO_C" >&6 +{ $as_echo "$as_me:$LINENO: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +$as_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` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { (exit 1); exit 1; }; } -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` +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +$as_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 + + +{ $as_echo "$as_me:$LINENO: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; then + $as_echo_n "(cached) " >&6 else - pkg_failed=yes + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +$as_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 + + +{ $as_echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if test "${ac_cv_path_SED+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + $as_unset ac_script || ac_script= + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done +done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + { { $as_echo "$as_me:$LINENO: error: no acceptable sed could be found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable sed could be found in \$PATH" >&2;} + { (exit 1); exit 1; }; } + fi else - pkg_failed=untried + ac_cv_path_SED=$SED 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 + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + + + + + +if test "x$GCC" = xyes ; then + CWARNFLAGS="-Wall -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes \ +-Wmissing-declarations -Wnested-externs -fno-strict-aliasing \ +-Wbad-function-cast -Wformat=2" + case `$CC -dumpversion` in + 3.4.* | 4.*) + CWARNFLAGS="$CWARNFLAGS -Wold-style-definition -Wdeclaration-after-statement" + ;; + esac +else + { $as_echo "$as_me:$LINENO: checking whether __SUNPRO_C is declared" >&5 +$as_echo_n "checking whether __SUNPRO_C is declared... " >&6; } +if test "${ac_cv_have_decl___SUNPRO_C+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef __SUNPRO_C + (void) __SUNPRO_C; +#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 ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 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` + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_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_have_decl___SUNPRO_C=yes else - pkg_failed=yes + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl___SUNPRO_C=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl___SUNPRO_C" >&5 +$as_echo "$ac_cv_have_decl___SUNPRO_C" >&6; } +if test $ac_cv_have_decl___SUNPRO_C = yes; then + SUNCC="yes" +else + SUNCC="no" fi + + if test "x$SUNCC" = "xyes"; then + CWARNFLAGS="-v" fi +fi + + + +# If the module's configure.ac calls AC_PROG_CC later on, CC gets set to C89 + + + +# Check whether --enable-strict-compilation was given. +if test "${enable_strict_compilation+set}" = set; then + enableval=$enable_strict_compilation; STRICT_COMPILE=$enableval else - pkg_failed=untried + STRICT_COMPILE=no fi +if test "x$STRICT_COMPILE" = "xyes"; then + { $as_echo "$as_me:$LINENO: checking whether __SUNPRO_C is declared" >&5 +$as_echo_n "checking whether __SUNPRO_C is declared... " >&6; } +if test "${ac_cv_have_decl___SUNPRO_C+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef __SUNPRO_C + (void) __SUNPRO_C; +#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 ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$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 + $as_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_have_decl___SUNPRO_C=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 -if test $pkg_failed = yes; then + ac_cv_have_decl___SUNPRO_C=no +fi -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl___SUNPRO_C" >&5 +$as_echo "$ac_cv_have_decl___SUNPRO_C" >&6; } +if test $ac_cv_have_decl___SUNPRO_C = yes; then + SUNCC="yes" else - _pkg_short_errors_supported=no + SUNCC="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: + { $as_echo "$as_me:$LINENO: checking whether __INTEL_COMPILER is declared" >&5 +$as_echo_n "checking whether __INTEL_COMPILER is declared... " >&6; } +if test "${ac_cv_have_decl___INTEL_COMPILER+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef __INTEL_COMPILER + (void) __INTEL_COMPILER; +#endif -$XKBCOMP_PKG_ERRORS + ; + 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 ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$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 + $as_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_have_decl___INTEL_COMPILER=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 -Consider adjusting the PKG_CONFIG_PATH environment variable if you -installed software in a non-standard prefix. + ac_cv_have_decl___INTEL_COMPILER=no +fi -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: +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl___INTEL_COMPILER" >&5 +$as_echo "$ac_cv_have_decl___INTEL_COMPILER" >&6; } +if test $ac_cv_have_decl___INTEL_COMPILER = yes; then + INTELCC="yes" +else + INTELCC="no" +fi -$XKBCOMP_PKG_ERRORS + if test "x$GCC" = xyes ; then + STRICT_CFLAGS="-pedantic -Werror" + elif test "x$SUNCC" = "xyes"; then + STRICT_CFLAGS="-errwarn" + elif test "x$INTELCC" = "xyes"; then + STRICT_CFLAGS="-Werror" + fi +fi +CWARNFLAGS="$CWARNFLAGS $STRICT_CFLAGS" -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://www.freedesktop.org/software/pkgconfig>. -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. +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION_MAJOR `echo $PACKAGE_VERSION | cut -d . -f 1` +_ACEOF -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. + PVM=`echo $PACKAGE_VERSION | cut -d . -f 2 | cut -d - -f 1` + if test "x$PVM" = "x"; then + PVM="0" + fi -To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>. -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 +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION_MINOR $PVM +_ACEOF + PVP=`echo $PACKAGE_VERSION | cut -d . -f 3 | cut -d - -f 1` + if test "x$PVP" = "x"; then + PVP="0" + fi +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION_PATCHLEVEL $PVP +_ACEOF -# Make sure we can run config.sub. -$ac_config_sub sun4 >/dev/null 2>&1 || - { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 -echo "$as_me: error: cannot run $ac_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_cv_build_alias=$build_alias -test -z "$ac_cv_build_alias" && - ac_cv_build_alias=`$ac_config_guess` -test -z "$ac_cv_build_alias" && - { { 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=`$ac_config_sub $ac_cv_build_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_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 -build=$ac_cv_build -build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +CHANGELOG_CMD="(GIT_DIR=\$(top_srcdir)/.git git log > \$(top_srcdir)/.changelog.tmp && \ +mv \$(top_srcdir)/.changelog.tmp \$(top_srcdir)/ChangeLog) \ +|| (rm -f \$(top_srcdir)/.changelog.tmp; touch \$(top_srcdir)/ChangeLog; \ +echo 'git directory not found: installing possibly empty changelog.' >&2)" -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 - ac_cv_host_alias=$host_alias -test -z "$ac_cv_host_alias" && - ac_cv_host_alias=$ac_cv_build_alias -ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} - { (exit 1); exit 1; }; } -fi -echo "$as_me:$LINENO: result: $ac_cv_host" >&5 -echo "${ECHO_T}$ac_cv_host" >&6 -host=$ac_cv_host -host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +macros_datadir=`$PKG_CONFIG --print-errors --variable=pkgdatadir xorg-macros` +INSTALL_CMD="(cp -f "$macros_datadir/INSTALL" \$(top_srcdir)/.INSTALL.tmp && \ +mv \$(top_srcdir)/.INSTALL.tmp \$(top_srcdir)/INSTALL) \ +|| (rm -f \$(top_srcdir)/.INSTALL.tmp; touch \$(top_srcdir)/INSTALL; \ +echo 'util-macros \"pkgdatadir\" from xorg-macros.pc not found: installing possibly empty INSTALL.' >&2)" + @@ -3286,47 +4886,373 @@ fi +XORG_MAN_PAGE="X Version 11" + +MAN_SUBSTS="\ + -e 's|__vendorversion__|\"\$(PACKAGE_STRING)\" \"\$(XORG_MAN_PAGE)\"|' \ + -e 's|__xorgversion__|\"\$(PACKAGE_STRING)\" \"\$(XORG_MAN_PAGE)\"|' \ + -e 's|__xservername__|Xorg|g' \ + -e 's|__xconfigfile__|xorg.conf|g' \ + -e 's|__projectroot__|\$(prefix)|g' \ + -e 's|__apploaddir__|\$(appdefaultdir)|g' \ + -e 's|__appmansuffix__|\$(APP_MAN_SUFFIX)|g' \ + -e 's|__drivermansuffix__|\$(DRIVER_MAN_SUFFIX)|g' \ + -e 's|__adminmansuffix__|\$(ADMIN_MAN_SUFFIX)|g' \ + -e 's|__libmansuffix__|\$(LIB_MAN_SUFFIX)|g' \ + -e 's|__miscmansuffix__|\$(MISC_MAN_SUFFIX)|g' \ + -e 's|__filemansuffix__|\$(FILE_MAN_SUFFIX)|g'" + + +AM_DEFAULT_VERBOSITY=1 -# Check whether --with-release-version or --without-release-version was given. -if test "${with_release_version+set}" = set; then - withval="$with_release_version" - RELEASE_VERSION="$withval" + + +ac_config_headers="$ac_config_headers config.h" + + +for ac_prog in 'bison -y' byacc +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_YACC+set}" = set; then + $as_echo_n "(cached) " >&6 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 + if test -n "$YACC"; then + ac_cv_prog_YACC="$YACC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_YACC="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION_MAJOR `echo $PACKAGE_VERSION | cut -d . -f 1` +fi +fi +YACC=$ac_cv_prog_YACC +if test -n "$YACC"; then + { $as_echo "$as_me:$LINENO: result: $YACC" >&5 +$as_echo "$YACC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$YACC" && break +done +test -n "$YACC" || YACC="yacc" + +# Extract the first word of "$YACC", so it can be a program name with args. +set dummy $YACC; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_YACC_INST+set}" = set; then + $as_echo_n "(cached) " >&6 +else + case $YACC_INST in + [\\/]* | ?:[\\/]*) + ac_cv_path_YACC_INST="$YACC_INST" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_YACC_INST="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + ;; +esac +fi +YACC_INST=$ac_cv_path_YACC_INST +if test -n "$YACC_INST"; then + { $as_echo "$as_me:$LINENO: result: $YACC_INST" >&5 +$as_echo "$YACC_INST" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +as_ac_File=`$as_echo "ac_cv_file_$srcdir/xkbparse.c" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $srcdir/xkbparse.c" >&5 +$as_echo_n "checking for $srcdir/xkbparse.c... " >&6; } +if { as_var=$as_ac_File; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + { { $as_echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +$as_echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "$srcdir/xkbparse.c"; then + eval "$as_ac_File=yes" +else + eval "$as_ac_File=no" +fi +fi +ac_res=`eval 'as_val=${'$as_ac_File'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if test `eval 'as_val=${'$as_ac_File'} + $as_echo "$as_val"'` = yes; then + : +else + test -z "$YACC_INST" && { { $as_echo "$as_me:$LINENO: error: yacc not found - unable to compile xkbparse.y" >&5 +$as_echo "$as_me: error: yacc not found - unable to compile xkbparse.y" >&2;} + { (exit 1); exit 1; }; } +fi + + + + + +for ac_func in strdup strcasecmp +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ _ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif - PVM=`echo $PACKAGE_VERSION | cut -d . -f 2 | cut -d - -f 1` - if test "x$PVM" = "x"; then - PVM="0" - fi +#undef $ac_func -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION_MINOR $PVM +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} _ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 - PVP=`echo $PACKAGE_VERSION | cut -d . -f 3 | cut -d - -f 1` - if test "x$PVP" = "x"; then - PVP="0" - fi + eval "$as_ac_var=no" +fi -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION_PATCHLEVEL $PVP +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if test `eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF +fi +done + + +# Checks for pkg-config packages + +pkg_failed=no +{ $as_echo "$as_me:$LINENO: checking for XKBCOMP" >&5 +$as_echo_n "checking for XKBCOMP... " >&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" && \ + { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"x11 xkbfile\"") >&5 + ($PKG_CONFIG --exists --print-errors "x11 xkbfile") 2>&5 + ac_status=$? + $as_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" && \ + { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"x11 xkbfile\"") >&5 + ($PKG_CONFIG --exists --print-errors "x11 xkbfile") 2>&5 + ac_status=$? + $as_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 + + { { $as_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 +$as_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 + { { $as_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://www.freedesktop.org/software/pkgconfig>. +See \`config.log' for more details." >&5 +$as_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://www.freedesktop.org/software/pkgconfig>. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +else + XKBCOMP_CFLAGS=$pkg_cv_XKBCOMP_CFLAGS + XKBCOMP_LIBS=$pkg_cv_XKBCOMP_LIBS + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + + +# Check whether --with-xkb_config_root was given. +if test "${with_xkb_config_root+set}" = set; then + withval=$with_xkb_config_root; XKBCONFIGROOT="$withval" +else + XKBCONFIGROOT='${datadir}/X11/xkb' +fi + - ac_config_files="$ac_config_files Makefile" + +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 @@ -3345,39 +5271,59 @@ _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, don't put newlines in cache variables' values. +# So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. -{ +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 +$as_echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) $as_unset $ac_var ;; + esac ;; + esac + done + (set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) + 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 \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; - esac; -} | + esac | + sort +) | sed ' + /^ac_cv_env_/b end t clear - : clear + :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end - /^ac_cv_env/!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 "updating cache $cache_file" + 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" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else - echo "not updating unwritable cache $cache_file" + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache @@ -3386,32 +5332,18 @@ test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' -# 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 - 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_i=`echo "$ac_i" | - sed 's/\$U\././;s/\.o$//;s/\.obj$//'` - # 2. Add them. - ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs @@ -3419,33 +5351,34 @@ 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. + { { $as_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. +$as_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. + { { $as_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. +$as_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. + { { $as_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. +$as_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_write_fail=0 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 +{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. @@ -3458,22 +5391,78 @@ ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## -# Be Bourne compatible +# 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 + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix + 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 + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } fi -DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then @@ -3483,33 +5472,60 @@ else fi +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + # Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH +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 - fi -done +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE # Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then +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 +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false @@ -3517,159 +5533,122 @@ fi # Name of the executable. -as_me=`$as_basename "$0" || +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'` - + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` -# PATH needs CR, and LINENO needs CR and PATH. -# 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 +# CDPATH. +$as_unset CDPATH -# 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 as_lineno_1=$LINENO as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - 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 - - ;; - 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_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 -echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - 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=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac + 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 before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. + # 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 - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | + # 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 - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop - s,-$,, - s,^['$as_cr_digits']*\n,, + s/-\n.*// ' >$as_me.lineno && - chmod +x $as_me.lineno || - { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 -echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + chmod +x "$as_me.lineno" || + { $as_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 sensible to this). - . ./$as_me.lineno + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" # Exit status is that of the last command. exit } -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; -esac +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -if expr a : '\(a\)' >/dev/null 2>&1; then +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 -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links - as_ln_s='cp -p' - else +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' fi -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$$.file +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=: @@ -3678,7 +5657,28 @@ else as_mkdir_p=false fi -as_executable_p="test -f" +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'" @@ -3687,31 +5687,14 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - exec 6>&1 -# Open the log real soon, to keep \$[0] and so on meaningful, and to +# 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. Logging --version etc. is OK. -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX -} >&5 -cat >&5 <<_CSEOF - -This file was extended by xkbcomp $as_me 1.0.5, which was -generated by GNU Autoconf 2.59. Invocation command line was +# values after options handling. +ac_log=" +This file was extended by xkbcomp $as_me 1.2.0, which was +generated by GNU Autoconf 2.62. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -3719,30 +5702,20 @@ generated by GNU Autoconf 2.59. Invocation command line was CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ -_CSEOF -echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 -echo >&5 +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + _ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. -if test -n "$ac_config_files"; then - echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_headers"; then - echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS -fi +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" -if test -n "$ac_config_links"; then - echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_commands"; then - echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS -fi - -cat >>$CONFIG_STATUS <<\_ACEOF +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. @@ -3750,14 +5723,14 @@ current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit - -V, --version print version number, 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 + instantiate the configuration file FILE --header=FILE[:TEMPLATE] - instantiate the configuration header FILE + instantiate the configuration header FILE Configuration files: $config_files @@ -3769,83 +5742,83 @@ Configuration commands: $config_commands Report bugs to <bug-autoconf@gnu.org>." -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ -xkbcomp config.status 1.0.5 -configured by $0, generated by GNU Autoconf 2.59, - with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" +xkbcomp config.status 1.2.0 +configured by $0, generated by GNU Autoconf 2.62, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright (C) 2008 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." -srcdir=$srcdir -INSTALL="$INSTALL" + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +AWK='$AWK' +test -n "\$AWK" || AWK=awk _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. +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) - ac_option=`expr "x$1" : 'x\([^=]*\)='` - ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; - -*) + *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; - *) # This is not an option, so the user has probably given explicit - # arguments. - ac_option=$1 - ac_need_defaults=false;; esac case $ac_option in # Handling of the options. -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; - --version | --vers* | -V ) - echo "$ac_cs_version"; exit 0 ;; - --he | --h) - # Conflict between --help and --header - { { echo "$as_me:$LINENO: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&5 -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 0 ;; - --debug | --d* | -d ) + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift - CONFIG_FILES="$CONFIG_FILES $ac_optarg" + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift - CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. - -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&5 -echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2;} + -*) { $as_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_config_targets="$ac_config_targets $1" + ac_need_defaults=false ;; esac shift @@ -3859,39 +5832,53 @@ if $ac_cs_silent; then fi _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 - exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" fi _ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 -cat >>$CONFIG_STATUS <<_ACEOF +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # -# INIT-COMMANDS section. +# INIT-COMMANDS # - AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF +# Handling of arguments. for ac_config_target in $ac_config_targets do - case "$ac_config_target" in - # Handling of arguments. - "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; - *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_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 @@ -3903,740 +5890,634 @@ if $ac_need_defaults; then fi # Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason to put it here, and in addition, +# simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. -# Create a temporary directory, and hook for its removal unless debugging. +# 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 || { - trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + 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 -q "./confstatXXXXXX") 2>/dev/null` && + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { - tmp=./confstat$$-$RANDOM - (umask 077 && mkdir $tmp) + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") } || { - echo "$me: cannot create a temporary directory in ." >&2 + $as_echo "$as_me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr='
' +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF -# -# CONFIG_FILES section. -# +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } -# 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 - # Protect against being on the right side of a sed subst in config.status. - sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; - s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF -s,@SHELL@,$SHELL,;t t -s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t -s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t -s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t -s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t -s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t -s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t -s,@exec_prefix@,$exec_prefix,;t t -s,@prefix@,$prefix,;t t -s,@program_transform_name@,$program_transform_name,;t t -s,@bindir@,$bindir,;t t -s,@sbindir@,$sbindir,;t t -s,@libexecdir@,$libexecdir,;t t -s,@datadir@,$datadir,;t t -s,@sysconfdir@,$sysconfdir,;t t -s,@sharedstatedir@,$sharedstatedir,;t t -s,@localstatedir@,$localstatedir,;t t -s,@libdir@,$libdir,;t t -s,@includedir@,$includedir,;t t -s,@oldincludedir@,$oldincludedir,;t t -s,@infodir@,$infodir,;t t -s,@mandir@,$mandir,;t t -s,@build_alias@,$build_alias,;t t -s,@host_alias@,$host_alias,;t t -s,@target_alias@,$target_alias,;t t -s,@DEFS@,$DEFS,;t t -s,@ECHO_C@,$ECHO_C,;t t -s,@ECHO_N@,$ECHO_N,;t t -s,@ECHO_T@,$ECHO_T,;t t -s,@LIBS@,$LIBS,;t t -s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t -s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t -s,@INSTALL_DATA@,$INSTALL_DATA,;t t -s,@CYGPATH_W@,$CYGPATH_W,;t t -s,@PACKAGE@,$PACKAGE,;t t -s,@VERSION@,$VERSION,;t t -s,@ACLOCAL@,$ACLOCAL,;t t -s,@AUTOCONF@,$AUTOCONF,;t t -s,@AUTOMAKE@,$AUTOMAKE,;t t -s,@AUTOHEADER@,$AUTOHEADER,;t t -s,@MAKEINFO@,$MAKEINFO,;t t -s,@install_sh@,$install_sh,;t t -s,@STRIP@,$STRIP,;t t -s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t -s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t -s,@mkdir_p@,$mkdir_p,;t t -s,@AWK@,$AWK,;t t -s,@SET_MAKE@,$SET_MAKE,;t t -s,@am__leading_dot@,$am__leading_dot,;t t -s,@AMTAR@,$AMTAR,;t t -s,@am__tar@,$am__tar,;t t -s,@am__untar@,$am__untar,;t t -s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t -s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t -s,@MAINT@,$MAINT,;t t -s,@CC@,$CC,;t t -s,@CFLAGS@,$CFLAGS,;t t -s,@LDFLAGS@,$LDFLAGS,;t t -s,@CPPFLAGS@,$CPPFLAGS,;t t -s,@ac_ct_CC@,$ac_ct_CC,;t t -s,@EXEEXT@,$EXEEXT,;t t -s,@OBJEXT@,$OBJEXT,;t t -s,@DEPDIR@,$DEPDIR,;t t -s,@am__include@,$am__include,;t t -s,@am__quote@,$am__quote,;t t -s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t -s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t -s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t -s,@CCDEPMODE@,$CCDEPMODE,;t t -s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t -s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t -s,@YACC@,$YACC,;t t -s,@PKG_CONFIG@,$PKG_CONFIG,;t t -s,@ac_pt_PKG_CONFIG@,$ac_pt_PKG_CONFIG,;t t -s,@XKBCOMP_CFLAGS@,$XKBCOMP_CFLAGS,;t t -s,@XKBCOMP_LIBS@,$XKBCOMP_LIBS,;t t -s,@build@,$build,;t t -s,@build_cpu@,$build_cpu,;t t -s,@build_vendor@,$build_vendor,;t t -s,@build_os@,$build_os,;t t -s,@host@,$host,;t t -s,@host_cpu@,$host_cpu,;t t -s,@host_vendor@,$host_vendor,;t t -s,@host_os@,$host_os,;t t -s,@APP_MAN_SUFFIX@,$APP_MAN_SUFFIX,;t t -s,@LIB_MAN_SUFFIX@,$LIB_MAN_SUFFIX,;t t -s,@FILE_MAN_SUFFIX@,$FILE_MAN_SUFFIX,;t t -s,@MISC_MAN_SUFFIX@,$MISC_MAN_SUFFIX,;t t -s,@DRIVER_MAN_SUFFIX@,$DRIVER_MAN_SUFFIX,;t t -s,@ADMIN_MAN_SUFFIX@,$ADMIN_MAN_SUFFIX,;t t -s,@APP_MAN_DIR@,$APP_MAN_DIR,;t t -s,@LIB_MAN_DIR@,$LIB_MAN_DIR,;t t -s,@FILE_MAN_DIR@,$FILE_MAN_DIR,;t t -s,@MISC_MAN_DIR@,$MISC_MAN_DIR,;t t -s,@DRIVER_MAN_DIR@,$DRIVER_MAN_DIR,;t t -s,@ADMIN_MAN_DIR@,$ADMIN_MAN_DIR,;t t -s,@LIBOBJS@,$LIBOBJS,;t t -s,@LTLIBOBJS@,$LTLIBOBJS,;t t -CEOF + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` = $ac_delim_num; then + break + elif $ac_last_try; then + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_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 +rm -f conf$$subs.sh +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\).*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\).*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' <conf$$subs.awk | sed ' +/^[^""]/{ + N + s/\n// +} +' >>$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" - cat >>$CONFIG_STATUS <<\_ACEOF - # Split the substitutions into bite-sized pieces for seds with - # small command number limits, like on Digital OSF/1 and HP-UX. - ac_max_sed_lines=48 - ac_sed_frag=1 # Number of current file. - ac_beg=1 # First line for current file. - ac_end=$ac_max_sed_lines # Line after last line for current file. - ac_more_lines=: - ac_sed_cmds= - while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - else - sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - fi - if test ! -s $tmp/subs.frag; then - ac_more_lines=false - else - # The purpose of the label and of the branching condition is to - # speed up the sed processing (if there are no `@' at all, there - # is no need to browse any of the substitutions). - # These are the two extra sed commands mentioned above. - (echo ':t - /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" - else - ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" - fi - ac_sed_frag=`expr $ac_sed_frag + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_lines` - fi - done - if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat - fi +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 1; }; } +_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 || ac_write_fail=1 fi # test -n "$CONFIG_FILES" +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} + { (exit 1); exit 1; }; } + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' <confdefs.h | sed ' +s/'"$ac_delim"'/"\\\ +"/g' >>$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + prefix = substr(line, 1, index(line, defundef) - 1) + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", line, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 +$as_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 - # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. - ac_dir=`(dirname "$ac_file") 2>/dev/null || + 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 || + { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; 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 '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; + 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'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir="$ac_dir" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } - ac_builddir=. -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix case $srcdir in - .) # No --srcdir option. We are building in place. + .) # We are building in place. ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. + 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 ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; + 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 -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac + case $ac_mode in + :F) + # + # CONFIG_FILE + # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac +_ACEOF - if test x"$ac_file" != x-; then - { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - rm -f "$ac_file" - fi - # 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. */ - if test x"$ac_file" = x-; then - configure_input= - else - configure_input="$ac_file. " - fi - configure_input=$configure_input"Generated from `echo $ac_file_in | - sed 's,.*/,,'` by configure." - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - echo "$f";; - *) # Relative - if test -f "$f"; then - # Build tree - echo "$f" - elif test -f "$srcdir/$f"; then - # Source tree - echo "$srcdir/$f" - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= + +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p +' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF - sed "$ac_vpsub +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub $extrasub _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s,@configure_input@,$configure_input,;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,@top_builddir@,$ac_top_builddir,;t t -s,@abs_top_builddir@,$ac_abs_top_builddir,;t t -s,@INSTALL@,$ac_INSTALL,;t t -" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out - rm -f $tmp/stdin - if test x"$ac_file" != x-; then - mv $tmp/out $ac_file - else - cat $tmp/out - rm -f $tmp/out - fi - -done -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } -# -# CONFIG_HEADER section. -# +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"; } && + { $as_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 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='[ ].*$,\1#\2' -ac_dC=' ' -ac_dD=',;t' -# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='$,\1#\2define\3' -ac_uC=' ' -ac_uD=',;t' - -for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + rm -f "$tmp/stdin" case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; - esac - - test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - # Do quote $f, to prevent DOS paths from being IFS'd. - echo "$f";; - *) # Relative - if test -f "$f"; then - # Build tree - echo "$f" - elif test -f "$srcdir/$f"; then - # Source tree - echo "$srcdir/$f" - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } - # Remove the trailing spaces. - sed 's/[ ]*$//' $ac_file_inputs >$tmp/in - -_ACEOF - -# Transform confdefs.h into two sed scripts, `conftest.defines' and -# `conftest.undefs', that substitutes the proper values into -# config.h.in to produce config.h. The first handles `#define' -# templates, and the second `#undef' templates. -# And first: Protect against being on the right side of a sed subst in -# config.status. Protect against being in an unquoted here document -# in config.status. -rm -f conftest.defines conftest.undefs -# Using a here document instead of a string reduces the quoting nightmare. -# Putting comments in sed scripts is not portable. -# -# `end' is used to avoid that the second main sed command (meant for -# 0-ary CPP macros) applies to n-ary macro definitions. -# See the Autoconf documentation for `clear'. -cat >confdef2sed.sed <<\_ACEOF -s/[\\&,]/\\&/g -s,[\\$`],\\&,g -t clear -: clear -s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp -t end -s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp -: end -_ACEOF -# If some macros were called several times there might be several times -# the same #defines, which is useless. Nevertheless, we may not want to -# sort them, since we want the *last* AC-DEFINE to be honored. -uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines -sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs -rm -f confdef2sed.sed - -# This sed command replaces #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. -cat >>conftest.undefs <<\_ACEOF -s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, -_ACEOF - -# Break up conftest.defines because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS -echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS -echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS -echo ' :' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.defines >/dev/null -do - # Write a limited-size here document to $tmp/defines.sed. - echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS - # Speed up: don't consider the non `#define' lines. - echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS - # Work around the forget-to-reset-the-flag bug. - echo 't clr' >>$CONFIG_STATUS - echo ': clr' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS - echo 'CEOF - sed -f $tmp/defines.sed $tmp/in >$tmp/out - rm -f $tmp/in - mv $tmp/out $tmp/in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail - rm -f conftest.defines - mv conftest.tail conftest.defines -done -rm -f conftest.defines -echo ' fi # grep' >>$CONFIG_STATUS -echo >>$CONFIG_STATUS - -# Break up conftest.undefs because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #undef templates' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.undefs >/dev/null -do - # Write a limited-size here document to $tmp/undefs.sed. - echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS - # Speed up: don't consider the non `#undef' - echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS - # Work around the forget-to-reset-the-flag bug. - echo 't clr' >>$CONFIG_STATUS - echo ': clr' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS - echo 'CEOF - sed -f $tmp/undefs.sed $tmp/in >$tmp/out - rm -f $tmp/in - mv $tmp/out $tmp/in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail - rm -f conftest.undefs - mv conftest.tail conftest.undefs -done -rm -f conftest.undefs - -cat >>$CONFIG_STATUS <<\_ACEOF - # 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. */ - if test x"$ac_file" = x-; then - echo "/* Generated by configure. */" >$tmp/config.h - else - echo "/* $ac_file. Generated by configure. */" >$tmp/config.h - fi - cat $tmp/in >>$tmp/config.h - rm -f $tmp/in + ;; + :H) + # + # CONFIG_HEADER + # if test x"$ac_file" != x-; then - 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;} + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} else - ac_dir=`(dirname "$ac_file") 2>/dev/null || -$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'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$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'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - - rm -f $ac_file - mv $tmp/config.h $ac_file + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } fi else - cat $tmp/config.h - rm -f $tmp/config.h + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } fi -# Compute $ac_file's index in $config_headers. +# Compute "$ac_file"'s index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in - $ac_file | $ac_file:* ) + "$ac_file" | "$ac_file":* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done -echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || -$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'`/stamp-h$_am_stamp_count -done -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF - -# -# CONFIG_COMMANDS section. -# -for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue - ac_dest=`echo "$ac_file" | sed 's,:.*,,'` - ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_dir=`(dirname "$ac_dest") 2>/dev/null || -$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_dest" : 'X\(//\)[^/]' \| \ - X"$ac_dest" : 'X\(//\)$' \| \ - X"$ac_dest" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_dest" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$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'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - - ac_builddir=. - -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi - -case $srcdir in - .) # No --srcdir option. We are building in place. - ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac +echo "timestamp for "$ac_file"" >`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac + :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac - { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 -echo "$as_me: executing $ac_dest commands" >&6;} - case $ac_dest in - depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + 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. @@ -4646,18 +6527,29 @@ echo "$as_me: executing $ac_dest commands" >&6;} # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then - dirpart=`(dirname "$mf") 2>/dev/null || + 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'` + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` else continue fi @@ -4679,59 +6571,90 @@ echo X"$mf" | sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue - fdir=`(dirname "$file") 2>/dev/null || + 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'` - { if $as_mkdir_p; then - mkdir -p $dirpart/$fdir - else - as_dir=$dirpart/$fdir + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { as_dir=$dirpart/$fdir + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 -echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_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 -_ACEOF +done # for ac_tag -cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save +test $ac_write_fail = 0 || + { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. @@ -4753,4 +6676,8 @@ if test "$no_create" != yes; then # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:$LINENO: WARNING: Unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: Unrecognized options: $ac_unrecognized_opts" >&2;} +fi diff --git a/app/xkbcomp/configure.ac b/app/xkbcomp/configure.ac index 2f3468fbb..c69230b78 100644 --- a/app/xkbcomp/configure.ac +++ b/app/xkbcomp/configure.ac @@ -20,23 +20,37 @@ 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]) +AC_PREREQ([2.60]) +AC_INIT([xkbcomp], [1.2.0], + [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [xkbcomp]) +AM_INIT_AUTOMAKE([foreign dist-bzip2]) AM_MAINTAINER_MODE +# Require X.Org macros 1.8 or later for MAN_SUBSTS set by XORG_MANPAGE_SECTIONS +m4_ifndef([XORG_MACROS_VERSION], + [m4_fatal([must install xorg-macros 1.8 or later before running autoconf/autogen])]) +XORG_MACROS_VERSION(1.8) +XORG_DEFAULT_OPTIONS + AM_CONFIG_HEADER(config.h) -AC_PROG_CC AC_PROG_YACC -AC_PROG_INSTALL +AC_PATH_PROG([YACC_INST], $YACC) +AC_CHECK_FILE([$srcdir/xkbparse.c], [], + [test -z "$YACC_INST" && AC_MSG_ERROR([yacc not found - unable to compile xkbparse.y])]) + + +AC_CHECK_FUNCS([strdup strcasecmp]) # 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_ARG_WITH([xkb_config_root], + [AC_HELP_STRING([--with-xkb-config-root=<paths>], + [Set default XKB config root (default: ${datadir}/X11/xkb)])], + [XKBCONFIGROOT="$withval"], + [XKBCONFIGROOT='${datadir}/X11/xkb']) +AC_SUBST([XKBCONFIGROOT]) + AC_OUTPUT([Makefile]) diff --git a/app/xkbcomp/expr.c b/app/xkbcomp/expr.c index 6e01d7daf..96fd95675 100644 --- a/app/xkbcomp/expr.c +++ b/app/xkbcomp/expr.c @@ -1,5 +1,3 @@ -/* $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. @@ -25,7 +23,6 @@ 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" @@ -38,789 +35,868 @@ 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; + static char buf[32]; + + switch (type) + { + case ExprValue: + strcpy(buf, "literal"); + break; + case ExprIdent: + strcpy(buf, "identifier"); + break; + case ExprActionDecl: + strcpy(buf, "action declaration"); + break; + case ExprFieldRef: + strcpy(buf, "field reference"); + break; + case ExprArrayRef: + strcpy(buf, "array reference"); + break; + case ExprKeysymList: + strcpy(buf, "list of keysyms"); + break; + case ExprActionList: + strcpy(buf, "list of actions"); + break; + case OpAdd: + strcpy(buf, "addition"); + break; + case OpSubtract: + strcpy(buf, "subtraction"); + break; + case OpMultiply: + strcpy(buf, "multiplication"); + break; + case OpDivide: + strcpy(buf, "division"); + break; + case OpAssign: + strcpy(buf, "assignment"); + break; + case OpNot: + strcpy(buf, "logical not"); + break; + case OpNegate: + strcpy(buf, "arithmetic negation"); + break; + case OpInvert: + strcpy(buf, "bitwise inversion"); + break; + case OpUnaryPlus: + strcpy(buf, "plus sign"); + break; + default: + snprintf(buf, sizeof(buf), "illegal(%d)", type); + break; + } + return buf; } char * exprTypeText(unsigned type) { -static char buf[20]; - - switch (type) { - case TypeUnknown: - strcpy(buf,"unknown"); - break; - case TypeBoolean: - strcpy(buf,"boolean"); - break; - case TypeInt: - strcpy(buf,"int"); - break; - case TypeString: - strcpy(buf,"string"); - break; - case TypeAction: - strcpy(buf,"action"); - break; - case TypeKeyName: - strcpy(buf,"keyname"); - break; - default: - sprintf(buf,"illegal(%d)",type); - break; - } - return buf; + static char buf[20]; + + switch (type) + { + case TypeUnknown: + strcpy(buf, "unknown"); + break; + case TypeBoolean: + strcpy(buf, "boolean"); + break; + case TypeInt: + strcpy(buf, "int"); + break; + case TypeString: + strcpy(buf, "string"); + break; + case TypeAction: + strcpy(buf, "action"); + break; + case TypeKeyName: + strcpy(buf, "keyname"); + break; + default: + snprintf(buf, sizeof(buf), "illegal(%d)", type); + break; + } + return buf; } int -ExprResolveLhs( ExprDef * expr, - ExprResult * elem_rtrn, - ExprResult * field_rtrn, - ExprDef ** index_rtrn) +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; + 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); + WSGO1("Unexpected operator %d in ResolveLhs\n", expr->op); return False; } Bool -SimpleLookup( XPointer priv, - Atom elem, - Atom field, - unsigned type, - ExprResult * val_rtrn) +SimpleLookup(XPointer priv, + Atom elem, Atom field, unsigned type, ExprResult * val_rtrn) { -LookupEntry * entry; -register char * str; + LookupEntry *entry; + register char *str; - if ((priv==NULL)|| - (field==None)||(elem!=None)|| - ((type!=TypeInt)&&(type!=TypeFloat))) { - return False; + 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; - } + 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) +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; + 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; + 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) +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; + 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); + 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 } + {"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) +LookupModIndex(XPointer priv, + Atom elem, Atom field, unsigned type, ExprResult * val_rtrn) { - return SimpleLookup((XPointer)modIndexNames,elem,field,type,val_rtrn); + return SimpleLookup((XPointer) modIndexNames, elem, field, type, + val_rtrn); } int -LookupModMask( XPointer priv, - Atom elem, - Atom field, - unsigned type, - ExprResult * val_rtrn) +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; + 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; + else + return False; return True; } int -ExprResolveModIndex( ExprDef * expr, - ExprResult * val_rtrn, - IdentLookupFunc lookup, - XPointer lookupPriv) +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; + 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; + 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) +ExprResolveModMask(ExprDef * expr, + ExprResult * val_rtrn, + IdentLookupFunc lookup, XPointer lookupPriv) { -LookupPriv priv; + LookupPriv priv; - priv.priv= NULL; - priv.chain= lookup; - priv.chainPriv= lookupPriv; - return ExprResolveMask(expr,val_rtrn,LookupModMask,(XPointer)&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) +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; + 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) +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; + int ok = 0; + ExprResult leftRtrn, rightRtrn; + ExprDef *left, *right; + + switch (expr->op) + { + case ExprValue: + if (expr->type == TypeString) + { + register char *str; + str = XkbAtomGetString(NULL, expr->value.str); + if ((str != NULL) && (strlen(str) == 1)) + { + val_rtrn->uval = str[0] * XkbGeomPtsPerMM; + return True; + } + } + if ((expr->type != TypeInt) && (expr->type != TypeFloat)) + { + ERROR1("Found constant of type %s, expected a number\n", + exprTypeText(expr->type)); + return False; + } + val_rtrn->ival = expr->value.ival; + if (expr->type == TypeInt) + val_rtrn->ival *= XkbGeomPtsPerMM; + return True; + case ExprIdent: + if (lookup) + { + ok = (*lookup) (lookupPriv, + None, expr->value.str, TypeFloat, val_rtrn); + } + if (!ok) + ERROR1("Numeric identifier \"%s\" unknown\n", + XkbAtomText(NULL, expr->value.str, XkbMessage)); + return ok; + case ExprFieldRef: + if (lookup) + { + ok = (*lookup) (lookupPriv, + expr->value.field.element, + expr->value.field.field, TypeFloat, val_rtrn); + } + if (!ok) + ERROR2("Numeric default \"%s.%s\" unknown\n", + XkbAtomText(NULL, expr->value.field.element, XkbMessage), + XkbAtomText(NULL, expr->value.field.field, XkbMessage)); + return ok; + case OpAdd: + case OpSubtract: + case OpMultiply: + case OpDivide: + left = expr->value.binary.left; + right = expr->value.binary.right; + if (ExprResolveFloat(left, &leftRtrn, lookup, lookupPriv) && + ExprResolveFloat(right, &rightRtrn, lookup, lookupPriv)) + { + switch (expr->op) + { + case OpAdd: + val_rtrn->ival = leftRtrn.ival + rightRtrn.ival; + break; + case OpSubtract: + val_rtrn->ival = leftRtrn.ival - rightRtrn.ival; + break; + case OpMultiply: + val_rtrn->ival = leftRtrn.ival * rightRtrn.ival; + break; + case OpDivide: + val_rtrn->ival = leftRtrn.ival / rightRtrn.ival; + break; + } + return True; + } + return False; + case OpAssign: + WSGO("Assignment operator not implemented yet\n"); + break; + case OpNot: + left = expr->value.child; + if (ExprResolveFloat(left, &leftRtrn, lookup, lookupPriv)) + { + ERROR("The ! operator cannot be applied to a number\n"); + } + return False; + case OpInvert: + case OpNegate: + left = expr->value.child; + if (ExprResolveFloat(left, &leftRtrn, lookup, lookupPriv)) + { + if (expr->op == OpNegate) + val_rtrn->ival = -leftRtrn.ival; + else + val_rtrn->ival = ~leftRtrn.ival; + return True; + } + return False; + case OpUnaryPlus: + left = expr->value.child; + return ExprResolveFloat(left, val_rtrn, lookup, lookupPriv); + default: + WSGO1("Unknown operator %d in ResolveFloat\n", expr->op); + break; } return False; } int -ExprResolveInteger( ExprDef * expr, - ExprResult * val_rtrn, - IdentLookupFunc lookup, - XPointer lookupPriv) +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; + int ok = 0; + ExprResult leftRtrn, rightRtrn; + ExprDef *left, *right; + + switch (expr->op) + { + case ExprValue: + if (expr->type == TypeString) + { + register char *str; + str = XkbAtomGetString(NULL, expr->value.str); + if (str != NULL) + switch (strlen(str)) + { + case 0: + val_rtrn->uval = 0; + return True; + case 1: + val_rtrn->uval = str[0]; + return True; + default: + break; + } + } + if ((expr->type != TypeInt) && (expr->type != TypeFloat)) + { + ERROR1 + ("Found constant of type %s where an int was expected\n", + exprTypeText(expr->type)); + return False; + } + val_rtrn->ival = expr->value.ival; + if (expr->type == TypeFloat) + val_rtrn->ival /= XkbGeomPtsPerMM; + return True; + case ExprIdent: + if (lookup) + { + ok = (*lookup) (lookupPriv, + None, expr->value.str, TypeInt, val_rtrn); + } + if (!ok) + ERROR1("Identifier \"%s\" of type int is unknown\n", + XkbAtomText(NULL, expr->value.str, XkbMessage)); + return ok; + case ExprFieldRef: + if (lookup) + { + ok = (*lookup) (lookupPriv, + expr->value.field.element, + expr->value.field.field, TypeInt, val_rtrn); + } + if (!ok) + ERROR2("Default \"%s.%s\" of type int is unknown\n", + XkbAtomText(NULL, expr->value.field.element, XkbMessage), + XkbAtomText(NULL, expr->value.field.field, XkbMessage)); + return ok; + case OpAdd: + case OpSubtract: + case OpMultiply: + case OpDivide: + left = expr->value.binary.left; + right = expr->value.binary.right; + if (ExprResolveInteger(left, &leftRtrn, lookup, lookupPriv) && + ExprResolveInteger(right, &rightRtrn, lookup, lookupPriv)) + { + switch (expr->op) + { + case OpAdd: + val_rtrn->ival = leftRtrn.ival + rightRtrn.ival; + break; + case OpSubtract: + val_rtrn->ival = leftRtrn.ival - rightRtrn.ival; + break; + case OpMultiply: + val_rtrn->ival = leftRtrn.ival * rightRtrn.ival; + break; + case OpDivide: + val_rtrn->ival = leftRtrn.ival / rightRtrn.ival; + break; + } + return True; + } + return False; + case OpAssign: + WSGO("Assignment operator not implemented yet\n"); + break; + case OpNot: + left = expr->value.child; + if (ExprResolveInteger(left, &leftRtrn, lookup, lookupPriv)) + { + ERROR("The ! operator cannot be applied to an integer\n"); + } + return False; + case OpInvert: + case OpNegate: + left = expr->value.child; + if (ExprResolveInteger(left, &leftRtrn, lookup, lookupPriv)) + { + if (expr->op == OpNegate) + val_rtrn->ival = -leftRtrn.ival; + else + val_rtrn->ival = ~leftRtrn.ival; + return True; + } + return False; + case OpUnaryPlus: + left = expr->value.child; + return ExprResolveInteger(left, val_rtrn, lookup, lookupPriv); + default: + WSGO1("Unknown operator %d in ResolveInteger\n", expr->op); + break; } return False; } int -ExprResolveString( ExprDef * expr, - ExprResult * val_rtrn, - IdentLookupFunc lookup, - XPointer lookupPriv) +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; + 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) +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; + 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; } @@ -828,149 +904,162 @@ char * bogus= NULL; /***====================================================================***/ int -ExprResolveEnum(ExprDef *expr,ExprResult *val_rtrn,LookupEntry *values) +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 (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; + 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) +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; + 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) +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; - } + 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'; + ok = ExprResolveInteger(expr, val_rtrn, lookup, lookupPriv); + if ((ok) && (val_rtrn->uval < 10)) + val_rtrn->uval += '0'; return ok; } diff --git a/app/xkbcomp/expr.h b/app/xkbcomp/expr.h index 065716da8..02519f941 100644 --- a/app/xkbcomp/expr.h +++ b/app/xkbcomp/expr.h @@ -1,4 +1,3 @@ -/* $Xorg: expr.h,v 1.3 2000/08/17 19:54:30 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,166 +23,150 @@ 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; +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; +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 { +typedef struct _LookupEntry +{ const char *name; - unsigned result; + unsigned result; } LookupEntry; -typedef struct _LookupTable { - char * element; - LookupEntry * entries; - struct _LookupTable * nextElement; +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 */ -); +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/app/xkbcomp/geometry.c b/app/xkbcomp/geometry.c index 8e47d7e43..6eb3fb880 100644 --- a/app/xkbcomp/geometry.c +++ b/app/xkbcomp/geometry.c @@ -1,4 +1,3 @@ -/* $Xorg: geometry.c,v 1.3 2000/08/17 19:54:30 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,7 +23,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. ********************************************************/ -/* $XFree86: xc/programs/xkbcomp/geometry.c,v 1.5tsi Exp $ */ #include "xkbcomp.h" #include "tokens.h" @@ -46,25 +44,27 @@ #define DFLT_ENCODING "iso8859-1" #define DFLT_SIZE 120 -typedef struct _PropertyInfo { - CommonInfo defs; - char * name; - char * value; +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; +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) \ @@ -75,12 +75,12 @@ typedef struct _ShapeInfo { #define _GD_Left (1<<2) #define _GD_Angle (1<<3) #define _GD_Shape (1<<4) -#define _GD_FontVariant (1<<4) /* CHEATING */ +#define _GD_FontVariant (1<<4) /* CHEATING */ #define _GD_Corner (1<<5) -#define _GD_Width (1<<5) /* CHEATING */ +#define _GD_Width (1<<5) /* CHEATING */ #define _GD_Color (1<<6) #define _GD_OffColor (1<<7) -#define _GD_Height (1<<7) /* CHEATING */ +#define _GD_Height (1<<7) /* CHEATING */ #define _GD_Text (1<<8) #define _GD_Font (1<<9) #define _GD_FontSlant (1<<10) @@ -93,30 +93,31 @@ typedef struct _ShapeInfo { #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; +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; @@ -129,14 +130,15 @@ typedef struct _DoodadInfo { #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; +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") @@ -144,35 +146,38 @@ typedef struct _KeyInfo { #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; +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]; +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; +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") @@ -185,434 +190,472 @@ typedef struct _OverlayInfo { #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; +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; +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) +ddText(Display * dpy, DoodadInfo * di) { -static char buf[64]; + static char buf[64]; - if (di==NULL) { - strcpy(buf,"default"); - return buf; + 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; + 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); + return XkbAtomText(dpy, di->name, XkbMessage); } /***====================================================================***/ static void -InitPropertyInfo(PropertyInfo *pi,GeometryInfo *info) +InitPropertyInfo(PropertyInfo * pi, GeometryInfo * info) { - pi->defs.defined= 0; - pi->defs.fileID= info->fileID; - pi->defs.merge= info->merge; - pi->name= pi->value= NULL; + 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); +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) +InitKeyInfo(KeyInfo * key, RowInfo * row, GeometryInfo * info) { - if (key!=&row->dfltKey) { - *key= row->dfltKey; - strcpy(key->name,"unknown"); - key->defs.defined&= ~_GK_Default; + 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; + 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) +ClearKeyInfo(KeyInfo * key) { - key->defs.defined&= ~_GK_Default; - strcpy(key->name,"default"); - key->gap= 0; - key->shape= None; - key->color= None; + 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) +FreeKeys(KeyInfo * key, RowInfo * row, GeometryInfo * info) { -KeyInfo * tmp; -KeyInfo * next; + KeyInfo *tmp; + KeyInfo *next; - if (row->keys==key) { - row->nKeys= 0; - row->keys= NULL; + 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); + 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!= §ion->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); +InitRowInfo(RowInfo * row, SectionInfo * section, GeometryInfo * info) +{ + if (row != §ion->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) +ClearRowInfo(RowInfo * row, GeometryInfo * info) { - row->defs.defined&= ~_GR_Default; - row->top= row->left= 0; - row->vertical= False; - row->nKeys= 0; + row->defs.defined &= ~_GR_Default; + row->top = row->left = 0; + row->vertical = False; + row->nKeys = 0; if (row->keys) - FreeKeys(row->keys,row,info); + FreeKeys(row->keys, row, info); ClearKeyInfo(&row->dfltKey); - row->dfltKey.defs.defined|= _GK_Default; + row->dfltKey.defs.defined |= _GK_Default; return; } static void -FreeRows(RowInfo *row,SectionInfo *section,GeometryInfo *info) +FreeRows(RowInfo * row, SectionInfo * section, GeometryInfo * info) { -RowInfo * next; -RowInfo * tmp; + RowInfo *next; + RowInfo *tmp; - if (row==section->rows) { - section->nRows= 0; - section->rows= NULL; + 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); + 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) +FindDoodadByType(DoodadInfo * di, unsigned type) { - while (di) { - if (di->type==type) - return di; - di= (DoodadInfo *)di->defs.next; + while (di) + { + if (di->type == type) + return di; + di = (DoodadInfo *) di->defs.next; } return NULL; } static DoodadInfo * -FindDoodadByName(DoodadInfo *di,Atom name) +FindDoodadByName(DoodadInfo * di, Atom name) { - while (di) { - if (di->name==name) - return di; - di= (DoodadInfo *)di->defs.next; + 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) +InitDoodadInfo(DoodadInfo * di, unsigned type, SectionInfo * si, + GeometryInfo * info) { -DoodadInfo * dflt; + DoodadInfo *dflt; - dflt= NULL; + 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++; + 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; + if (si->nextDoodadPriority > XkbGeomMaxPriority) + si->nextDoodadPriority = XkbGeomMaxPriority; #endif } - else { - di->priority= info->nextPriority++; - if (info->nextPriority>XkbGeomMaxPriority) - info->nextPriority= XkbGeomMaxPriority; + else + { + di->priority = info->nextPriority++; + if (info->nextPriority > XkbGeomMaxPriority) + info->nextPriority = XkbGeomMaxPriority; } return; } static void -ClearDoodadInfo(DoodadInfo *di) +ClearDoodadInfo(DoodadInfo * di) { -CommonInfo defs; + CommonInfo defs; - defs= di->defs; - bzero(di,sizeof(DoodadInfo)); - di->defs= defs; - di->defs.defined= 0; + defs = di->defs; + bzero(di, sizeof(DoodadInfo)); + di->defs = defs; + di->defs.defined = 0; return; } static void -ClearOverlayInfo(OverlayInfo *ol) +ClearOverlayInfo(OverlayInfo * ol) { - if (ol && ol->keys) { - ol->keys= (OverlayKeyInfo *)ClearCommonInfo(&ol->keys->defs); - ol->nKeys= 0; + 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); +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); +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; +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; +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) +FreeSections(SectionInfo * si, GeometryInfo * info) { -SectionInfo * tmp; -SectionInfo * next; + SectionInfo *tmp; + SectionInfo *next; - if (si==info->sections) { - info->nSections= 0; - info->sections= NULL; + 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); + 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); +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; } @@ -620,300 +663,342 @@ ShapeInfo * next; /***====================================================================***/ static void -InitGeometryInfo(GeometryInfo *info,unsigned fileID,unsigned merge) +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; + 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) +ClearGeometryInfo(GeometryInfo * info) { if (info->name) - uFree(info->name); - info->name= NULL; + uFree(info->name); + info->name = NULL; if (info->props) - FreeProperties(info->props,info); + FreeProperties(info->props, info); if (info->shapes) - FreeShapes(info->shapes,info); + 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; + 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); + ClearAliases(&info->aliases); return; } /***====================================================================***/ static PropertyInfo * -NextProperty(GeometryInfo *info) +NextProperty(GeometryInfo * info) { -PropertyInfo * pi; + PropertyInfo *pi; - pi= uTypedAlloc(PropertyInfo); - if (pi) { - bzero((char *)pi,sizeof(PropertyInfo)); - info->props= (PropertyInfo *)AddCommonInfo(&info->props->defs, - (CommonInfo *)pi); - info->nProps++; + 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) +FindProperty(GeometryInfo * info, char *name) { -PropertyInfo * old; + 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; + 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); +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) +NextShape(GeometryInfo * info) { -ShapeInfo * si; + 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; + 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; +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; +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) +ReplaceDoodad(DoodadInfo * into, DoodadInfo * from) { -CommonInfo * next; + CommonInfo *next; - next= into->defs.next; + next = into->defs.next; ClearDoodadInfo(into); - *into= *from; - into->defs.next= next; - next= from->defs.next; + *into = *from; + into->defs.next = next; + next = from->defs.next; ClearDoodadInfo(from); - from->defs.next= next; + from->defs.next = next; return; } static DoodadInfo * -NextDfltDoodad(SectionInfo *si,GeometryInfo *info) +NextDfltDoodad(SectionInfo * si, GeometryInfo * info) { -DoodadInfo * di; + DoodadInfo *di; - di= uTypedCalloc(1,DoodadInfo); - if (!di) - return NULL; - if (si) { - si->dfltDoodads= (DoodadInfo *)AddCommonInfo(&si->dfltDoodads->defs, - (CommonInfo *)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); + 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++; - } +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; +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; - } +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; } @@ -921,55 +1006,66 @@ unsigned type; /***====================================================================***/ 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); +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; } @@ -977,79 +1073,91 @@ OverlayInfo * old; /***====================================================================***/ 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++; +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) +FindMatchingSection(GeometryInfo * info, SectionInfo * new) { -SectionInfo * old; + SectionInfo *old; - for (old=info->sections;old!=NULL;old=(SectionInfo *)old->defs.next) { - if (new->name==old->name) - return 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) +AddSection(GeometryInfo * info, SectionInfo * new) { -SectionInfo * old; + SectionInfo *old; - old= FindMatchingSection(info,new); - if (old!=NULL) { + 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; + 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"); + 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; - } + 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; } @@ -1057,302 +1165,344 @@ SectionInfo * old; /***====================================================================***/ 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++; +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) +AddRow(SectionInfo * si, RowInfo * new) { -RowInfo * old; + RowInfo *old; - old= new; - if ((new= NextRow(si))==NULL) - return False; - *new= *old; - new->defs.next= NULL; - old->nKeys= 0; - old->keys= NULL; + 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) +NextKey(RowInfo * row) { -KeyInfo * key; + KeyInfo *key; - key= uTypedAlloc(KeyInfo); - if (key) { - *key= row->dfltKey; - key->defs.defined&= ~_GK_Default; - key->defs.next= NULL; - key->index= row->nKeys++; + 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) +AddKey(RowInfo * row, KeyInfo * new) { -KeyInfo * old; + 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); + 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++; +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 */ -); +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; - } - } +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); + *info = included; + else + { + MergeIncludedGeometry(info, &included, newMerge); + ClearGeometryInfo(&included); } - return (info->errorCount==0); + 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; +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)); + 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)); +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 @@ -1360,873 +1510,1038 @@ const char *typeName; #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; +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)); +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)); +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)); +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; +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)); +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)); +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) +SetGeometryProperty(GeometryInfo * info, char *property, ExprDef * value) { -PropertyInfo pi; -ExprResult result; + 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; + 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); + 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); +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; +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; +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; +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; } @@ -2234,43 +2549,45 @@ VarDef * var; /***====================================================================***/ 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; +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; } @@ -2278,283 +2595,322 @@ OverlayInfo ol; /***====================================================================***/ 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; - } - } +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; - } +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; +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)); + } + 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; +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) { +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"); + ERROR("Too many errors\n"); #endif - ACTION1("Abandoning geometry file \"%s\"\n",file->topName); - break; - } + ACTION1("Abandoning geometry file \"%s\"\n", file->topName); + break; + } } return; } @@ -2562,290 +2918,348 @@ char * failWhat; /***====================================================================***/ 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]; +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; +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; } @@ -2853,113 +3267,129 @@ VerifyDoodadInfo(DoodadInfo *di,GeometryInfo *info) #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; +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; +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; } @@ -2967,131 +3397,153 @@ ShapeInfo * si; /***====================================================================***/ 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; +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"); - } + 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; + 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]++; + 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); +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; } @@ -3099,88 +3551,106 @@ int i; /***====================================================================***/ 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; +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; } @@ -3188,90 +3658,111 @@ Atom name; /***====================================================================***/ 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; +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/app/xkbcomp/indicators.c b/app/xkbcomp/indicators.c index 3061f3e27..d4a362fb8 100644 --- a/app/xkbcomp/indicators.c +++ b/app/xkbcomp/indicators.c @@ -1,4 +1,3 @@ -/* $Xorg: indicators.c,v 1.3 2000/08/17 19:54:31 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,7 +23,6 @@ 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" @@ -47,439 +45,531 @@ /***====================================================================***/ void -ClearIndicatorMapInfo(Display *dpy,LEDInfo *info) +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; + 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) +AddIndicatorMap(LEDInfo * oldLEDs, LEDInfo * new) { -LEDInfo *old,*last; -unsigned collide; + 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; + 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 = uTypedAlloc(LEDInfo); + if (!old) + { + WSGO("Couldn't allocate indicator map\n"); + ACTION1("Map for indicator %s not compiled\n", + XkbAtomText(NULL, new->name, XkbMessage)); + return NULL; } - *old= *new; - old->defs.next= NULL; - if (last) { - last->defs.next= &old->defs; - return oldLEDs; + *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 } +static LookupEntry modComponentNames[] = { + {"base", XkbIM_UseBase} + , + {"latched", XkbIM_UseLatched} + , + {"locked", XkbIM_UseLocked} + , + {"effective", XkbIM_UseEffective} + , + {"compat", XkbIM_UseCompat} + , + {"any", XkbIM_UseAnyMods} + , + {"none", 0} + , + {NULL, 0} }; -LookupEntry groupComponentNames[] = { - { "base", XkbIM_UseBase }, - { "latched", XkbIM_UseLatched }, - { "locked", XkbIM_UseLocked }, - { "effective", XkbIM_UseEffective }, - { "any", XkbIM_UseAnyGroup }, - { "none", 0 }, - { NULL, 0 } +static LookupEntry groupComponentNames[] = { + {"base", XkbIM_UseBase} + , + {"latched", XkbIM_UseLatched} + , + {"locked", XkbIM_UseLocked} + , + {"effective", XkbIM_UseEffective} + , + {"any", XkbIM_UseAnyGroup} + , + {"none", 0} + , + {NULL, 0} }; int -SetIndicatorMapField( LEDInfo * led, - XkbDescPtr xkb, - char * field, - ExprDef * arrayNdx, - ExprDef * value) +SetIndicatorMapField(LEDInfo * led, + XkbDescPtr xkb, + char *field, ExprDef * arrayNdx, ExprDef * value) { -ExprResult rtrn; -Bool ok; + 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; + 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, "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, "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, "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, "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, "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,"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 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 { - ERROR2("Unknown field %s in map for %s indicator\n",field, - XkbAtomText(NULL,led->name,XkbMessage)); - ACTION("Definition ignored\n"); - ok= False; + 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) +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; + LEDInfo led, *rtrn; + VarDef *var; + Bool ok; - led= *dflt; - led.defs.merge= merge; - led.name= def->name; + if (def->merge != MergeDefault) + merge = def->merge; - 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; - } + 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; + if (ok) + { + rtrn = AddIndicatorMap(oldLEDs, &led); + return rtrn; } return NULL; } -Bool -CopyIndicatorMapDefs(XkbFileInfo *result,LEDInfo *leds,LEDInfo **unboundRtrn) +Bool +CopyIndicatorMapDefs(XkbFileInfo * result, LEDInfo * leds, + LEDInfo ** unboundRtrn) { -LEDInfo * led,*next; -LEDInfo * unbound,*last; -XkbDescPtr xkb; + 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"); + 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; + 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; + 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); - } + 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; + if (unboundRtrn != NULL) + { + *unboundRtrn = unbound; } return True; } Bool -BindIndicators( XkbFileInfo * result, - Bool force, - LEDInfo * unbound, - LEDInfo ** unboundRtrn) +BindIndicators(XkbFileInfo * result, + Bool force, LEDInfo * unbound, LEDInfo ** unboundRtrn) { -XkbDescPtr xkb; -register int i; -register LEDInfo *led,*next,*last; + 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; - } - } - } - } + 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); - } - } + 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; + if (unboundRtrn) + { + *unboundRtrn = unbound; } - else if (unbound) { - for (led=unbound;led!=NULL;led=next) { - next= (LEDInfo *)led->defs.next; - uFree(led); - } + else if (unbound) + { + for (led = unbound; led != NULL; led = next) + { + next = (LEDInfo *) led->defs.next; + uFree(led); + } } return True; } diff --git a/app/xkbcomp/indicators.h b/app/xkbcomp/indicators.h index 041cacc17..35ae38a4c 100644 --- a/app/xkbcomp/indicators.h +++ b/app/xkbcomp/indicators.h @@ -1,4 +1,3 @@ -/* $Xorg: indicators.h,v 1.3 2000/08/17 19:54:32 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,7 +23,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. ********************************************************/ -/* $XFree86$ */ #ifndef INDICATORS_H #define INDICATORS_H 1 @@ -39,57 +37,52 @@ #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; +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 void ClearIndicatorMapInfo(Display * /* dpy */ , + LEDInfo * /* info */ + ); -extern LEDInfo *AddIndicatorMap( - LEDInfo * /* oldLEDs */, - LEDInfo * /* newLED */ -); +extern LEDInfo *AddIndicatorMap(LEDInfo * /* oldLEDs */ , + LEDInfo * /* newLED */ + ); -extern int SetIndicatorMapField( - LEDInfo * /* led */, - XkbDescPtr /* xkb */, - char * /* field */, - ExprDef * /* arrayNdx */, - ExprDef * /* value */ -); +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 LEDInfo *HandleIndicatorMapDef(IndicatorMapDef * /* stmt */ , + XkbDescPtr /* xkb */ , + LEDInfo * /* dflt */ , + LEDInfo * /* oldLEDs */ , + unsigned /* mergeMode */ + ); -extern Bool CopyIndicatorMapDefs( - XkbFileInfo * /* result */, - LEDInfo * /* leds */, - LEDInfo ** /* unboundRtrn */ -); +extern Bool CopyIndicatorMapDefs(XkbFileInfo * /* result */ , + LEDInfo * /* leds */ , + LEDInfo ** /* unboundRtrn */ + ); -extern Bool BindIndicators( - XkbFileInfo * /* result */, - Bool /* force */, - LEDInfo * /* unbound */, - LEDInfo ** /* unboundRtrn */ -); +extern Bool BindIndicators(XkbFileInfo * /* result */ , + Bool /* force */ , + LEDInfo * /* unbound */ , + LEDInfo ** /* unboundRtrn */ + ); #endif /* INDICATORS_H */ diff --git a/app/xkbcomp/keycodes.c b/app/xkbcomp/keycodes.c index a86592e4d..13579ec1a 100644 --- a/app/xkbcomp/keycodes.c +++ b/app/xkbcomp/keycodes.c @@ -1,4 +1,3 @@ -/* $Xorg: keycodes.c,v 1.4 2000/08/17 19:54:32 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,7 +23,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. ********************************************************/ -/* $XFree86$ */ #include "xkbcomp.h" #include "tokens.h" @@ -34,715 +32,862 @@ #include "alias.h" char * -longText(unsigned long val,unsigned format) +longText(unsigned long val, unsigned format) { -char buf[4]; + char buf[4]; - LongToKeyName(val,buf); - return XkbKeyNameText(buf,format); + LongToKeyName(val, buf); + return XkbKeyNameText(buf, format); } /***====================================================================***/ void -LongToKeyName(unsigned long val,char *name) +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); + 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; +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; +typedef struct _KeyNamesInfo +{ + char *name; /* e.g. evdev+aliases(qwerty) */ + int errorCount; + unsigned fileID; + unsigned merge; + int computedMin; /* lowest keycode stored */ + int computedMax; /* highest keycode stored */ + int explicitMin; + int explicitMax; + int effectiveMin; + int effectiveMax; + unsigned long names[XkbMaxLegalKeyCode + 1]; /* 4-letter name of key, keycode is the index */ + unsigned files[XkbMaxLegalKeyCode + 1]; + unsigned char has_alt_forms[XkbMaxLegalKeyCode + 1]; + IndicatorNameInfo *leds; + AliasInfo *aliases; } KeyNamesInfo; +static void HandleKeycodesFile(XkbFile * file, + XkbDescPtr xkb, + unsigned merge, + KeyNamesInfo * info); + static void -InitIndicatorNameInfo(IndicatorNameInfo *ii,KeyNamesInfo *info) +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; + 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) +static void +ClearIndicatorNameInfo(IndicatorNameInfo * ii, KeyNamesInfo * info) { - if (ii==info->leds) { - ClearCommonInfo(&ii->defs); - info->leds= NULL; + if (ii == info->leds) + { + ClearCommonInfo(&ii->defs); + info->leds = NULL; } return; } static IndicatorNameInfo * -NextIndicatorName(KeyNamesInfo *info) +NextIndicatorName(KeyNamesInfo * info) { -IndicatorNameInfo * ii; + IndicatorNameInfo *ii; - ii= uTypedAlloc(IndicatorNameInfo); - if (ii) { - InitIndicatorNameInfo(ii,info); - info->leds= (IndicatorNameInfo *)AddCommonInfo(&info->leds->defs, - (CommonInfo *)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) +FindIndicatorByIndex(KeyNamesInfo * info, int ndx) { -IndicatorNameInfo * old; + IndicatorNameInfo *old; - for (old= info->leds;old!=NULL;old=(IndicatorNameInfo *)old->defs.next) { - if (old->ndx==ndx) - return 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) +FindIndicatorByName(KeyNamesInfo * info, Atom name) { -IndicatorNameInfo * old; + IndicatorNameInfo *old; - for (old= info->leds;old!=NULL;old=(IndicatorNameInfo *)old->defs.next) { - if (old->name==name) - return 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) +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; + IndicatorNameInfo *old; + Bool replace; + + replace = (new->defs.merge == MergeReplace) || + (new->defs.merge == MergeOverride); + old = FindIndicatorByName(info, new->name); + if (old) + { + if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0)) + || (warningLevel > 9)) + { + WARN1("Multiple indicators named %s\n", + XkbAtomText(NULL, new->name, XkbMessage)); + if (old->ndx == new->ndx) + { + if (old->virtual != new->virtual) + { + if (replace) + old->virtual = new->virtual; + ACTION2("Using %s instead of %s\n", + (old->virtual ? "virtual" : "real"), + (old->virtual ? "real" : "virtual")); + } + else + { + ACTION("Identical definitions ignored\n"); + } + return True; + } + else + { + if (replace) + ACTION2("Ignoring %d, using %d\n", old->ndx, new->ndx); + else + ACTION2("Using %d, ignoring %d\n", old->ndx, new->ndx); + } + if (replace) + { + if (info->leds == old) + info->leds = (IndicatorNameInfo *) old->defs.next; + else + { + IndicatorNameInfo *tmp; + tmp = info->leds; + for (; tmp != NULL; + tmp = (IndicatorNameInfo *) tmp->defs.next) + { + if (tmp->defs.next == (CommonInfo *) old) + { + tmp->defs.next = old->defs.next; + break; + } + } + } + uFree(old); + } + } + } + old = FindIndicatorByIndex(info, new->ndx); + if (old) + { + if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0)) + || (warningLevel > 9)) + { + WARN1("Multiple names for indicator %d\n", new->ndx); + if ((old->name == new->name) && (old->virtual == new->virtual)) + ACTION("Identical definitions ignored\n"); + else + { + const char *oldType, *newType; + Atom using, ignoring; + if (old->virtual) + oldType = "virtual indicator"; + else + oldType = "real indicator"; + if (new->virtual) + newType = "virtual indicator"; + else + newType = "real indicator"; + if (replace) + { + using = new->name; + ignoring = old->name; + } + else + { + using = old->name; + ignoring = new->name; + } + ACTION4("Using %s %s, ignoring %s %s\n", + oldType, XkbAtomText(NULL, using, XkbMessage), + newType, XkbAtomText(NULL, ignoring, XkbMessage)); + } + } + if (replace) + { + old->name = new->name; + old->virtual = new->virtual; + } + return True; + } + old = new; + new = NextIndicatorName(info); + if (!new) + { + WSGO1("Couldn't allocate name for indicator %d\n", new->ndx); + ACTION("Ignored\n"); + return False; + } + new->name = old->name; + new->ndx = old->ndx; + new->virtual = old->virtual; return True; } static void -ClearKeyNamesInfo(KeyNamesInfo *info) +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->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); + ClearIndicatorNameInfo(info->leds, info); if (info->aliases) - ClearAliases(&info->aliases); + ClearAliases(&info->aliases); return; } static void -InitKeyNamesInfo(KeyNamesInfo *info) +InitKeyNamesInfo(KeyNamesInfo * info) { - info->name= NULL; - info->leds= NULL; - info->aliases= NULL; + info->name = NULL; + info->leds = NULL; + info->aliases = NULL; ClearKeyNamesInfo(info); - info->errorCount= 0; + info->errorCount = 0; return; } static int -FindKeyByLong(KeyNamesInfo *info,unsigned long name) +FindKeyByLong(KeyNamesInfo * info, unsigned long name) { -register int i; + register int i; - for (i=info->effectiveMin;i<=info->effectiveMax;i++) { - if (info->names[i]==name) - return i; + for (i = info->effectiveMin; i <= info->effectiveMax; i++) + { + if (info->names[i] == name) + return i; } return 0; } +/** + * Store the name of the key as a long in the info struct under the given + * keycode. If the same keys is referred to twice, print a warning. + * Note that the key's name is stored as a long, the keycode is the index. + */ static Bool -AddKeyName( KeyNamesInfo * info, - int kc, - char * name, - unsigned merge, - unsigned fileID, - Bool reportCollisions) +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); + 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) +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; + 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 */ -); - +/** + * Handle the given include statement (e.g. "include "evdev+aliases(qwerty)"). + * + * @param stmt The include statement from the keymap file. + * @param xkb Unused for all but the xkb->flags. + * @param info Struct to store the key info in. + */ static Bool -HandleIncludeKeycodes( IncludeStmt * stmt, - XkbDescPtr xkb, - KeyNamesInfo * info, - FileHandler hndlr) +HandleIncludeKeycodes(IncludeStmt * stmt, XkbDescPtr xkb, KeyNamesInfo * info) { -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; - } - } + unsigned newMerge; + XkbFile *rtrn; + KeyNamesInfo included = {NULL}; + Bool haveSelf; + + haveSelf = False; + if ((stmt->file == NULL) && (stmt->map == NULL)) + { + haveSelf = True; + included = *info; + bzero(info, sizeof(KeyNamesInfo)); + } + else if (strcmp(stmt->file, "computed") == 0) + { + xkb->flags |= AutoKeyNames; + info->explicitMin = XkbMinLegalKeyCode; + info->explicitMax = XkbMaxLegalKeyCode; + return (info->errorCount == 0); + } /* parse file, store returned info in the xkb struct */ + else if (ProcessIncludeFile(stmt, XkmKeyNamesIndex, &rtrn, &newMerge)) + { + InitKeyNamesInfo(&included); + HandleKeycodesFile(rtrn, xkb, MergeOverride, &included); + if (stmt->stmt != NULL) + { + if (included.name != NULL) + uFree(included.name); + included.name = stmt->stmt; + stmt->stmt = NULL; + } + } + else + { + info->errorCount += 10; /* XXX: why 10?? */ + return False; + } + /* Do we have more than one include statement? */ + if ((stmt->next != NULL) && (included.errorCount < 1)) + { + IncludeStmt *next; + unsigned op; + KeyNamesInfo next_incl; + + for (next = stmt->next; next != NULL; next = next->next) + { + if ((next->file == NULL) && (next->map == NULL)) + { + haveSelf = True; + MergeIncludedKeycodes(&included, info, next->merge); + ClearKeyNamesInfo(info); + } + else if (ProcessIncludeFile(next, XkmKeyNamesIndex, &rtrn, &op)) + { + InitKeyNamesInfo(&next_incl); + HandleKeycodesFile(rtrn, xkb, MergeOverride, &next_incl); + MergeIncludedKeycodes(&included, &next_incl, op); + ClearKeyNamesInfo(&next_incl); + } + else + { + info->errorCount += 10; /* XXX: Why 10?? */ + return False; + } + } } if (haveSelf) - *info= included; - else { - MergeIncludedKeycodes(info,&included,newMerge); - ClearKeyNamesInfo(&included); + *info = included; + else + { + MergeIncludedKeycodes(info, &included, newMerge); + ClearKeyNamesInfo(&included); } - return (info->errorCount==0); + return (info->errorCount == 0); } +/** + * Parse the given statement and store the output in the info struct. + * e.g. <ESC> = 9 + */ static int -HandleKeycodeDef( KeycodeDef * stmt, - XkbDescPtr xkb, - unsigned merge, - KeyNamesInfo * info) +HandleKeycodeDef(KeycodeDef * stmt, unsigned merge, KeyNamesInfo * info) { -int code; -ExprResult result; - - if (!ExprResolveInteger(stmt->value,&result,NULL,NULL)) { - ACTION1("No value keycode assigned to name <%s>\n",stmt->name); - return 0; - } - code= result.ival; - if ((code<info->effectiveMin)||(code>info->effectiveMax)) { - ERROR2("Illegal keycode %d for name <%s>\n",code,stmt->name); - ACTION2("Must be in the range %d-%d inclusive\n",info->effectiveMin, - info->effectiveMax); - return 0; - } - if (stmt->merge!=MergeDefault) { - if (stmt->merge==MergeReplace) - merge= MergeOverride; - else merge= stmt->merge; - } - return AddKeyName(info,code,stmt->name,merge,info->fileID,True); + int code; + ExprResult result; + + if (!ExprResolveInteger(stmt->value, &result, NULL, NULL)) + { + ACTION1("No value keycode assigned to name <%s>\n", stmt->name); + return 0; + } + code = result.ival; + if ((code < info->effectiveMin) || (code > info->effectiveMax)) + { + ERROR2("Illegal keycode %d for name <%s>\n", code, stmt->name); + ACTION2("Must be in the range %d-%d inclusive\n", + info->effectiveMin, info->effectiveMax); + return 0; + } + if (stmt->merge != MergeDefault) + { + if (stmt->merge == MergeReplace) + merge = MergeOverride; + else + merge = stmt->merge; + } + return AddKeyName(info, code, stmt->name, merge, info->fileID, True); } #define MIN_KEYCODE_DEF 0 #define MAX_KEYCODE_DEF 1 +/** + * Handle the minimum/maximum statement of the xkb file. + * Sets explicitMin/Max and effectiveMin/Max of the info struct. + * + * @return 1 on success, 0 otherwise. + */ static int -HandleKeyNameVar(VarDef *stmt,XkbDescPtr xkb,unsigned merge,KeyNamesInfo *info) +HandleKeyNameVar(VarDef * stmt, KeyNamesInfo * info) { -ExprResult tmp,field; -ExprDef * arrayNdx; -int which; - - if (ExprResolveLhs(stmt->name,&tmp,&field,&arrayNdx)==0) - return 0; /* internal error, already reported */ - - if (tmp.str!=NULL) { - ERROR1("Unknown element %s encountered\n",tmp.str); - ACTION1("Default for field %s ignored\n",field.str); - return 0; - } - if (uStrCaseCmp(field.str,"minimum")==0) which= MIN_KEYCODE_DEF; - else if (uStrCaseCmp(field.str,"maximum")==0) which= MAX_KEYCODE_DEF; - else { - ERROR("Unknown field encountered\n"); - ACTION1("Assigment to field %s ignored\n",field.str); - return 0; - } - if (arrayNdx!=NULL) { - ERROR1("The %s setting is not an array\n",field.str); - ACTION("Illegal array reference ignored\n"); - return 0; - } - - if (ExprResolveInteger(stmt->value,&tmp,NULL,NULL)==0) { - ACTION1("Assignment to field %s ignored\n",field.str); - return 0; - } - if ((tmp.ival<XkbMinLegalKeyCode)||(tmp.ival>XkbMaxLegalKeyCode)) { - ERROR3("Illegal keycode %d (must be in the range %d-%d inclusive)\n", - tmp.ival,XkbMinLegalKeyCode,XkbMaxLegalKeyCode); - ACTION1("Value of \"%s\" not changed\n",field.str); - return 0; - } - if (which==MIN_KEYCODE_DEF) { - if ((info->explicitMax>0)&&(info->explicitMax<tmp.ival)) { - ERROR2("Minimum key code (%d) must be <= maximum key code (%d)\n", - tmp.ival,info->explicitMax); - ACTION("Minimum key code value not changed\n"); - return 0; - } - if ((info->computedMax>0)&&(info->computedMin<tmp.ival)) { - ERROR2("Minimum key code (%d) must be <= lowest defined key (%d)\n", - tmp.ival,info->computedMin); - ACTION("Minimum key code value not changed\n"); - return 0; - } - info->explicitMin= tmp.ival; - info->effectiveMin= tmp.ival; - } - if (which==MAX_KEYCODE_DEF) { - if ((info->explicitMin>0)&&(info->explicitMin>tmp.ival)) { - ERROR2("Maximum code (%d) must be >= minimum key code (%d)\n", - tmp.ival,info->explicitMin); - ACTION("Maximum code value not changed\n"); - return 0; - } - if ((info->computedMax>0)&&(info->computedMax>tmp.ival)) { - ERROR2("Maximum code (%d) must be >= highest defined key (%d)\n", - tmp.ival,info->computedMax); - ACTION("Maximum code value not changed\n"); - return 0; - } - info->explicitMax= tmp.ival; - info->effectiveMax= tmp.ival; + 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) +HandleIndicatorNameDef(IndicatorNameDef * def, + unsigned merge, KeyNamesInfo * info) { -IndicatorNameInfo ii; -ExprResult tmp; - - if ((def->ndx<1)||(def->ndx>XkbNumIndicators)) { - info->errorCount++; - ERROR1("Name specified for illegal indicator index %d\n",def->ndx); - ACTION("Ignored\n"); - return False; - } - InitIndicatorNameInfo(&ii,info); - ii.ndx= def->ndx; - if (!ExprResolveString(def->name,&tmp,NULL,NULL)) { - char buf[20]; - 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; + IndicatorNameInfo ii; + ExprResult tmp; + + if ((def->ndx < 1) || (def->ndx > XkbNumIndicators)) + { + info->errorCount++; + ERROR1("Name specified for illegal indicator index %d\n", def->ndx); + ACTION("Ignored\n"); + return False; + } + InitIndicatorNameInfo(&ii, info); + ii.ndx = def->ndx; + if (!ExprResolveString(def->name, &tmp, NULL, NULL)) + { + char buf[20]; + snprintf(buf, sizeof(buf), "%d", def->ndx); + info->errorCount++; + return ReportBadType("indicator", "name", buf, "string"); + } + ii.name = XkbInternAtom(NULL, tmp.str, False); + ii.virtual = def->virtual; + if (!AddIndicatorName(info, &ii)) + return False; return True; } +/** + * Handle the xkb_keycodes section of a xkb file. + * All information about parsed keys is stored in the info struct. + * + * Such a section may have include statements, in which case this function is + * semi-recursive (it calls HandleIncludeKeycodes, which may call + * HandleKeycodesFile again). + * + * @param file The input file (parsed xkb_keycodes section) + * @param xkb Necessary to pass down, may have flags changed. + * @param merge Merge strategy (MergeOverride, etc.) + * @param info Struct to contain the fully parsed key information. + */ static void -HandleKeycodesFile( XkbFile * file, - XkbDescPtr xkb, - unsigned merge, - KeyNamesInfo * info) +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) { + ParseCommon *stmt; + + info->name = uStringDup(file->name); + stmt = file->defs; + while (stmt) + { + switch (stmt->stmtType) + { + case StmtInclude: /* e.g. include "evdev+aliases(qwerty)" */ + if (!HandleIncludeKeycodes((IncludeStmt *) stmt, xkb, info)) + info->errorCount++; + break; + case StmtKeycodeDef: /* e.g. <ESC> = 9; */ + if (!HandleKeycodeDef((KeycodeDef *) stmt, merge, info)) + info->errorCount++; + break; + case StmtKeyAliasDef: /* e.g. alias <MENU> = <COMP>; */ + if (!HandleAliasDef((KeyAliasDef *) stmt, + merge, info->fileID, &info->aliases)) + info->errorCount++; + break; + case StmtVarDef: /* e.g. minimum, maximum */ + if (!HandleKeyNameVar((VarDef *) stmt, info)) + info->errorCount++; + break; + case StmtIndicatorNameDef: /* e.g. indicator 1 = "Caps Lock"; */ + if (!HandleIndicatorNameDef((IndicatorNameDef *) stmt, + merge, info)) + { + info->errorCount++; + } + break; + case StmtInterpDef: + case StmtVModDef: + ERROR("Keycode files may define key and indicator names only\n"); + ACTION1("Ignoring definition of %s\n", + ((stmt->stmtType == + StmtInterpDef) ? "a symbol interpretation" : + "virtual modifiers")); + info->errorCount++; + break; + default: + WSGO1("Unexpected statement type %d in HandleKeycodesFile\n", + stmt->stmtType); + break; + } + stmt = stmt->next; + if (info->errorCount > 10) + { #ifdef NOISY - ERROR("Too many errors\n"); + ERROR("Too many errors\n"); #endif - ACTION1("Abandoning keycodes file \"%s\"\n",file->topName); - break; - } + ACTION1("Abandoning keycodes file \"%s\"\n", file->topName); + break; + } } return; } +/** + * Compile the xkb_keycodes section, parse it's output, return the results. + * + * @param file The parsed XKB file (may have include statements requiring + * further parsing) + * @param result The effective keycodes, as gathered from the file. + * @param merge Merge strategy. + * + * @return True on success, False otherwise. + */ Bool -CompileKeycodes(XkbFile *file,XkbFileInfo *result,unsigned merge) +CompileKeycodes(XkbFile * file, XkbFileInfo * result, unsigned merge) { -KeyNamesInfo info; -XkbDescPtr xkb; + KeyNamesInfo info; /* contains all the info after parsing */ + XkbDescPtr xkb; - xkb= result->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; + HandleKeycodesFile(file, xkb, merge, &info); + + /* all the keys are now stored in info */ + + if (info.errorCount == 0) + { + if (info.explicitMin > 0) /* if "minimum" statement was present */ + xkb->min_key_code = info.effectiveMin; + else + xkb->min_key_code = info.computedMin; + if (info.explicitMax > 0) /* if "maximum" statement was present */ + xkb->max_key_code = info.effectiveMax; + else + xkb->max_key_code = info.computedMax; + if (XkbAllocNames(xkb, XkbKeyNamesMask | XkbIndicatorNamesMask, 0, 0) + == Success) + { + register int i; + xkb->names->keycodes = XkbInternAtom(xkb->dpy, info.name, False); + uDEBUG2(1, "key range: %d..%d\n", xkb->min_key_code, + xkb->max_key_code); + for (i = info.computedMin; i <= info.computedMax; i++) + { + LongToKeyName(info.names[i], xkb->names->keys[i].name); + uDEBUG2(2, "key %d = %s\n", i, + XkbKeyNameText(xkb->names->keys[i].name, XkbMessage)); + } + } + else + { + WSGO("Cannot create XkbNamesRec in CompileKeycodes\n"); + return False; + } + if (info.leds) + { + IndicatorNameInfo *ii; + if (XkbAllocIndicatorMaps(xkb) != Success) + { + WSGO("Couldn't allocate IndicatorRec in CompileKeycodes\n"); + ACTION("Physical indicators not set\n"); + } + for (ii = info.leds; ii != NULL; + ii = (IndicatorNameInfo *) ii->defs.next) + { + xkb->names->indicators[ii->ndx - 1] = + XkbInternAtom(xkb->dpy, + XkbAtomGetString(NULL, ii->name), False); + if (xkb->indicators != NULL) + { + register unsigned bit; + bit = 1 << (ii->ndx - 1); + if (ii->virtual) + xkb->indicators->phys_indicators &= ~bit; + else + xkb->indicators->phys_indicators |= bit; + } + } + } + if (info.aliases) + ApplyAliases(xkb, False, &info.aliases); + return True; } ClearKeyNamesInfo(&info); return False; diff --git a/app/xkbcomp/keycodes.h b/app/xkbcomp/keycodes.h index 9333718cc..11f4460fe 100644 --- a/app/xkbcomp/keycodes.h +++ b/app/xkbcomp/keycodes.h @@ -1,4 +1,3 @@ -/* $Xorg: keycodes.h,v 1.3 2000/08/17 19:54:32 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,21 +23,18 @@ 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 char *longText(unsigned long /* val */ , + unsigned /* format */ + ); -extern void LongToKeyName( - unsigned long /* val */, - char * /* name_rtrn */ -); +extern void LongToKeyName(unsigned long /* val */ , + char * /* name_rtrn */ + ); #endif /* KEYCODES_H */ diff --git a/app/xkbcomp/keymap.c b/app/xkbcomp/keymap.c index 86e9c9e8f..a419d8c42 100644 --- a/app/xkbcomp/keymap.c +++ b/app/xkbcomp/keymap.c @@ -1,4 +1,3 @@ -/* $Xorg: keymap.c,v 1.3 2000/08/17 19:54:32 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,7 +23,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. ********************************************************/ -/* $XFree86$ */ #include "xkbcomp.h" #include "tokens.h" @@ -41,128 +39,145 @@ #define SYMBOLS 4 #define MAX_SECTIONS 5 -XkbFile * sections[MAX_SECTIONS]; +static XkbFile *sections[MAX_SECTIONS]; +/** + * Compile the given file and store the output in result. + * @param file A list of XkbFiles, each denoting one type (e.g. + * XkmKeyNamesIdx, etc.) + */ Bool -CompileKeymap(XkbFile *file,XkbFileInfo *result,unsigned merge) +CompileKeymap(XkbFile * file, XkbFileInfo * result, unsigned merge) { -unsigned have; -Bool ok; -unsigned required,legal; -unsigned mainType; -char * mainName; -LEDInfo * unbound= NULL; + 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; + bzero(sections, MAX_SECTIONS * sizeof(XkbFile *)); + mainType = file->type; + mainName = file->name; + switch (mainType) + { + case XkmSemanticsFile: + required = XkmSemanticsRequired; + legal = XkmSemanticsLegal; + break; + case XkmLayoutFile: /* standard type if setxkbmap -print */ + required = XkmLayoutRequired; + legal = XkmKeymapLegal; + break; + case XkmKeymapFile: + required = XkmKeymapRequired; + legal = XkmKeymapLegal; + break; + default: + ERROR1("Cannot compile %s alone into an XKM file\n", + XkbConfigText(mainType, XkbMessage)); + return False; } - have= 0; - ok= 1; - file= (XkbFile *)file->defs; - 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; + have = 0; + ok = 1; + file = (XkbFile *) file->defs; + /* Check for duplicate entries in the input file */ + while ((file) && (ok)) + { + file->topName = mainName; + if ((have & (1 << file->type)) != 0) + { + ERROR2("More than one %s section in a %s file\n", + XkbConfigText(file->type, XkbMessage), + XkbConfigText(mainType, XkbMessage)); + ACTION("All sections after the first ignored\n"); + ok = False; + } + else if ((1 << file->type) & (~legal)) + { + ERROR2("Cannot define %s in a %s file\n", + XkbConfigText(file->type, XkbMessage), + XkbConfigText(mainType, XkbMessage)); + ok = False; + } + else + switch (file->type) + { + case XkmSemanticsFile: + case XkmLayoutFile: + case XkmKeymapFile: + WSGO2("Illegal %s configuration in a %s file\n", + XkbConfigText(file->type, XkbMessage), + XkbConfigText(mainType, XkbMessage)); + ACTION("Ignored\n"); + ok = False; + break; + case XkmKeyNamesIndex: + sections[KEYCODES] = file; + break; + case XkmTypesIndex: + sections[TYPES] = file; + break; + case XkmSymbolsIndex: + sections[SYMBOLS] = file; + break; + case XkmCompatMapIndex: + sections[COMPAT] = file; + break; + case XkmGeometryIndex: + case XkmGeometryFile: + sections[GEOMETRY] = file; + break; + case XkmVirtualModsIndex: + case XkmIndicatorsIndex: + WSGO1("Found an isolated %s section\n", + XkbConfigText(file->type, XkbMessage)); + break; + default: + WSGO1("Unknown file type %d\n", file->type); + break; + } + if (ok) + have |= (1 << file->type); + file = (XkbFile *) file->common.next; } - 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); + /* compile the sections we have in the file one-by-one, or fail. */ + if (ok) + { + if (ok && (sections[KEYCODES] != NULL)) + ok = CompileKeycodes(sections[KEYCODES], result, MergeOverride); + if (ok && (sections[GEOMETRY] != NULL)) + ok = CompileGeometry(sections[GEOMETRY], result, MergeOverride); + if (ok && (sections[TYPES] != NULL)) + ok = CompileKeyTypes(sections[TYPES], result, MergeOverride); + if (ok && (sections[COMPAT] != NULL)) + ok = CompileCompatMap(sections[COMPAT], result, MergeOverride, + &unbound); + if (ok && (sections[SYMBOLS] != NULL)) + ok = CompileSymbols(sections[SYMBOLS], result, MergeOverride); } if (!ok) - return False; - result->defined= have; - if (required&(~have)) { - register int i,bit; - unsigned missing; - missing= required&(~have); - for (i=0,bit=1;missing!=0;i++,bit<<=1) { - if (missing&bit) { - ERROR2("Missing %s section in a %s file\n", - XkbConfigText(i,XkbMessage), - XkbConfigText(mainType,XkbMessage)); - missing&=~bit; - } - } - ACTION1("Description of %s not compiled\n", - XkbConfigText(mainType,XkbMessage)); - ok= False; + 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); + ok = BindIndicators(result, True, unbound, NULL); return ok; } - diff --git a/app/xkbcomp/keytypes.c b/app/xkbcomp/keytypes.c index b09345b79..da55d755d 100644 --- a/app/xkbcomp/keytypes.c +++ b/app/xkbcomp/keytypes.c @@ -1,4 +1,3 @@ -/* $Xorg: keytypes.c,v 1.3 2000/08/17 19:54:32 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,7 +23,6 @@ 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" @@ -33,13 +31,14 @@ #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; +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) @@ -48,39 +47,41 @@ typedef struct _PreserveInfo { #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; +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; +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; +Atom tok_ONE_LEVEL; +Atom tok_TWO_LEVEL; +Atom tok_ALPHABETIC; +Atom tok_KEYPAD; /***====================================================================***/ @@ -91,29 +92,26 @@ Atom tok_KEYPAD; /***====================================================================***/ -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 */ -); +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) @@ -128,131 +126,147 @@ extern Bool AddLevelName( /***====================================================================***/ static void -InitKeyTypesInfo(KeyTypesInfo *info,XkbDescPtr xkb,KeyTypesInfo *from) +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; - } - } + 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) +FreeKeyTypeInfo(KeyTypeInfo * type) { - if (type->entries!=NULL) { - uFree(type->entries); - type->entries= NULL; + if (type->entries != NULL) + { + uFree(type->entries); + type->entries = NULL; } - if (type->lvlNames!=NULL) { - uFree(type->lvlNames); - type->lvlNames= NULL; + if (type->lvlNames != NULL) + { + uFree(type->lvlNames); + type->lvlNames = NULL; } - if (type->preserve!=NULL) { - ClearCommonInfo(&type->preserve->defs); - type->preserve= NULL; + if (type->preserve != NULL) + { + ClearCommonInfo(&type->preserve->defs); + type->preserve = NULL; } return; } static void -FreeKeyTypesInfo(KeyTypesInfo *info) +FreeKeyTypesInfo(KeyTypesInfo * info) { - info->dpy= NULL; + 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); + 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) +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++; + 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) +FindMatchingKeyType(KeyTypesInfo * info, KeyTypeInfo * new) { -KeyTypeInfo *old; + KeyTypeInfo *old; - for (old=info->types;old;old=(KeyTypeInfo *)old->defs.next) { - if (old->name==new->name) - return old; + for (old = info->types; old; old = (KeyTypeInfo *) old->defs.next) + { + if (old->name == new->name) + return old; } return NULL; } @@ -260,900 +274,1020 @@ KeyTypeInfo *old; static Bool ReportTypeBadWidth(const char *type, int has, int needs) { - ERROR3("Key type \"%s\" has %d levels, must have %d\n",type,has,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) +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; + 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_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_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; + 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 = 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; + 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) +MergeIncludedKeyTypes(KeyTypesInfo * into, + KeyTypesInfo * from, unsigned merge, XkbDescPtr xkb) { -KeyTypeInfo * type; + KeyTypeInfo *type; - if (from->errorCount>0) { - into->errorCount+= from->errorCount; - return; + if (from->errorCount > 0) + { + into->errorCount += from->errorCount; + return; } - if (into->name==NULL) { - into->name= from->name; - from->name= NULL; + 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++; + 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; + into->stdPresent |= from->stdPresent; return; } -typedef void (*FileHandler)( - XkbFile * /* file */, - XkbDescPtr /* xkb */, - unsigned /* merge */, - KeyTypesInfo * /* included */ -); +typedef void (*FileHandler) (XkbFile * /* file */ , + XkbDescPtr /* xkb */ , + unsigned /* merge */ , + KeyTypesInfo * /* included */ + ); static Bool -HandleIncludeKeyTypes( IncludeStmt * stmt, - XkbDescPtr xkb, - KeyTypesInfo * info, - FileHandler hndlr) +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)); + 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 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; + 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 ((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); + *info = included; + else + { + MergeIncludedKeyTypes(info, &included, newMerge, xkb); + FreeKeyTypesInfo(&included); } - return (info->errorCount==0); + return (info->errorCount == 0); } /***====================================================================***/ static XkbKTMapEntryPtr -FindMatchingMapEntry(KeyTypeInfo *type,unsigned mask,unsigned vmask) +FindMatchingMapEntry(KeyTypeInfo * type, unsigned mask, unsigned vmask) { -register int i; -XkbKTMapEntryPtr entry; + 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; + 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) +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--; - } + register int i, n; + + for (i = 0; i < type->nEntries; i++) + { + if (type->entries[i].level == 0) + { + for (n = i; n < type->nEntries - 1; n++) + { + type->entries[n] = type->entries[n + 1]; + } + type->nEntries--; + } } return; } +/** + * Return a pointer to the next free XkbKTMapEntry, reallocating space if + * necessary. + */ static XkbKTMapEntryPtr -NextMapEntry(KeyTypeInfo *type) +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; + 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; - } + 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) +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) { + 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)); + 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; + } + 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 = 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); + *old = *new; + old->matchingMapIndex = -1; + type->preserve = + (PreserveInfo *) AddCommonInfo(&type->preserve->defs, &old->defs); return True; } +/** + * Add a new KTMapEntry to the given key type. If an entry with the same mods + * already exists, the level is updated (if clobber is TRUE). Otherwise, a new + * entry is created. + * + * @param clobber Overwrite existing entry. + * @param report True if a warning is to be printed on. + */ Bool -AddMapEntry( XkbDescPtr xkb, - KeyTypeInfo * type, - XkbKTMapEntryPtr new, - Bool clobber, - Bool report) +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; + 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; + 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 } + {"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) +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; + ExprResult rtrn; + XkbKTMapEntryRec entry; + + if (arrayNdx == NULL) + return ReportTypeShouldBeArray(type, "map entry"); + if (!ExprResolveModMask(arrayNdx, &rtrn, LookupVModMask, (XPointer) xkb)) + return ReportTypeBadType(type, "map entry", "modifier mask"); + entry.mods.real_mods = rtrn.uval & 0xff; /* modifiers < 512 */ + entry.mods.vmods = (rtrn.uval >> 8) & 0xffff; /* modifiers > 512 */ + if ((entry.mods.real_mods & (~type->mask)) || + ((entry.mods.vmods & (~type->vmask)) != 0)) + { + if (warningLevel > 0) + { + WARN1("Map entry for unused modifiers in %s\n", TypeTxt(type)); + ACTION1("Using %s instead of ", + XkbVModMaskText(type->dpy, xkb, + entry.mods.real_mods & type->mask, + entry.mods.vmods & type->vmask, + XkbMessage)); + INFO1("%s\n", MapEntryTxt(type, xkb, &entry)); + } + entry.mods.real_mods &= type->mask; + entry.mods.vmods &= type->vmask; } - if (!ExprResolveInteger(value,&rtrn,SimpleLookup,(XPointer)lnames)) { - ERROR("Level specifications in a key type must be integer\n"); - ACTION("Ignoring malformed level specification\n"); - return False; + if (!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; + 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); + entry.level = rtrn.ival - 1; + return AddMapEntry(xkb, type, &entry, True, True); } static Bool -SetPreserve( KeyTypeInfo * type, - XkbDescPtr xkb, - ExprDef * arrayNdx, - ExprDef * value) +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)); + 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; + 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)); - } + 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); + return AddPreserve(xkb, type, &new, True, True); } /***====================================================================***/ Bool -AddLevelName( KeyTypeInfo * type, - unsigned level, - Atom name, - Bool clobber, - Bool report) +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; + 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] == 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; + 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; + if (level >= type->numLevels) + type->numLevels = level + 1; + type->lvlNames[level] = name; return True; } static Bool -SetLevelName(KeyTypeInfo *type,ExprDef *arrayNdx,ExprDef *value) +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; + 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; + 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); + return + AddLevelName(type, level, XkbInternAtom(NULL, rtrn.str, False), True, + True); } /***====================================================================***/ +/** + * Parses the fields in a type "..." { } description. + * + * @param field The field to parse (e.g. modifiers, map, level_name) + */ static Bool -SetKeyTypeField( KeyTypeInfo * type, - XkbDescPtr xkb, - char * field, - ExprDef * arrayNdx, - ExprDef * value, - KeyTypesInfo * info) +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; + ExprResult tmp; + + if (uStrCaseCmp(field, "modifiers") == 0) + { + unsigned mods, vmods; + if (arrayNdx != NULL) + { + WARN("The modifiers field of a key type is not an array\n"); + ACTION("Illegal array subscript ignored\n"); + } + /* get modifier mask for current type */ + if (!ExprResolveModMask(value, &tmp, LookupVModMask, (XPointer) xkb)) + { + ERROR("Key type mask field must be a modifier mask\n"); + ACTION("Key type definition ignored\n"); + return False; + } + mods = tmp.uval & 0xff; /* core mods */ + vmods = (tmp.uval >> 8) & 0xffff; /* xkb virtual mods */ + if (type->defs.defined & _KT_Mask) + { + WARN1("Multiple modifier mask definitions for key type %s\n", + XkbAtomText(type->dpy, type->name, XkbMessage)); + ACTION1("Using %s, ", TypeMaskTxt(type, xkb)); + INFO1("ignoring %s\n", XkbVModMaskText(type->dpy, xkb, mods, + vmods, XkbMessage)); + return False; + } + type->mask = mods; + type->vmask = vmods; + type->defs.defined |= _KT_Mask; + return True; } - else if (uStrCaseCmp(field,"map")==0) { - type->defs.defined|= _KT_Map; - return SetMapEntry(type,xkb,arrayNdx,value); + else if (uStrCaseCmp(field, "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, "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); + 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)); + 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) +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)); + 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"); + 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) +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); + int ok = 1; + ExprResult tmp, field; + ExprDef *arrayNdx; + + for (; def != NULL; def = (VarDef *) def->common.next) + { + if ((def->name) && (def->name->type == ExprFieldRef)) + { + ok = HandleKeyTypeVar(def, xkb, info); + continue; + } + ok = ExprResolveLhs(def->name, &tmp, &field, &arrayNdx); + if (ok) + ok = SetKeyTypeField(type, xkb, field.str, arrayNdx, def->value, + info); } return ok; } +/** + * Process a type "XYZ" { } specification in the xkb_types section. + * + */ static int -HandleKeyTypeDef( KeyTypeDef * def, - XkbDescPtr xkb, - unsigned merge, - KeyTypesInfo * info) +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; + register int i; + KeyTypeInfo type; + + if (def->merge != MergeDefault) + merge = def->merge; + + type.defs.defined = 0; + type.defs.fileID = info->fileID; + type.defs.merge = merge; + type.defs.next = NULL; + type.dpy = info->dpy; + type.name = def->name; + type.mask = info->dflt.mask; + type.vmask = info->dflt.vmask; + type.groupInfo = info->dflt.groupInfo; + type.numLevels = 1; + type.nEntries = type.szEntries = 0; + type.entries = NULL; + type.szNames = 0; + type.lvlNames = NULL; + type.preserve = NULL; + + /* Parse the actual content. */ + if (!HandleKeyTypeBody(def->body, xkb, &type, info)) + { + info->errorCount++; + return False; } /* now copy any appropriate map, preserve or level names from the */ /* default type */ - for (i=0;i<info->dflt.nEntries;i++) { - XkbKTMapEntryPtr dflt; - dflt= &info->dflt.entries[i]; - if (((dflt->mods.real_mods&type.mask)==dflt->mods.real_mods)&& - ((dflt->mods.vmods&type.vmask)==dflt->mods.vmods)) { - AddMapEntry(xkb,&type,dflt,False,False); - } + 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; - } + 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); - } + 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; + /* Now add the new keytype to the info struct */ + if (!AddKeyType(xkb, info, &type)) + { + info->errorCount++; + return False; } return True; } +/** + * Process an xkb_types section. + * + * @param file The parsed xkb_types section. + * @param merge Merge Strategy (e.g. MergeOverride) + * @param info Pointer to memory where the outcome will be stored. + */ static void -HandleKeyTypesFile( XkbFile * file, - XkbDescPtr xkb, - unsigned merge, - KeyTypesInfo * info) +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) { + ParseCommon *stmt; + + info->name = uStringDup(file->name); + stmt = file->defs; + while (stmt) + { + switch (stmt->stmtType) + { + case StmtInclude: + if (!HandleIncludeKeyTypes((IncludeStmt *) stmt, xkb, info, + HandleKeyTypesFile)) + info->errorCount++; + break; + case StmtKeyTypeDef: /* e.g. type "ONE_LEVEL" */ + if (!HandleKeyTypeDef((KeyTypeDef *) stmt, xkb, merge, info)) + info->errorCount++; + break; + case StmtVarDef: + if (!HandleKeyTypeVar((VarDef *) stmt, xkb, info)) + info->errorCount++; + break; + case StmtVModDef: /* virtual_modifiers NumLock, ... */ + if (!HandleVModDef((VModDef *) stmt, merge, &info->vmods)) + info->errorCount++; + break; + case StmtKeyAliasDef: + ERROR("Key type files may not include other declarations\n"); + ACTION("Ignoring definition of key alias\n"); + info->errorCount++; + break; + case StmtKeycodeDef: + ERROR("Key type files may not include other declarations\n"); + ACTION("Ignoring definition of key name\n"); + info->errorCount++; + break; + case StmtInterpDef: + ERROR("Key type files may not include other declarations\n"); + ACTION("Ignoring definition of symbol interpretation\n"); + info->errorCount++; + break; + default: + WSGO1("Unexpected statement type %d in HandleKeyTypesFile\n", + stmt->stmtType); + break; + } + stmt = stmt->next; + if (info->errorCount > 10) + { #ifdef NOISY - ERROR("Too many errors\n"); + ERROR("Too many errors\n"); #endif - ACTION1("Abandoning keytypes file \"%s\"\n",file->topName); - break; - } + ACTION1("Abandoning keytypes file \"%s\"\n", file->topName); + break; + } } return; } static Bool -CopyDefToKeyType(XkbDescPtr xkb,XkbKeyTypePtr type,KeyTypeInfo *def) +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; + 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; - } - } + 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->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; + else + { + type->level_names = NULL; } - def->nEntries= def->szEntries= 0; - def->entries= NULL; - return XkbComputeEffectiveMap(xkb,type,NULL); + def->nEntries = def->szEntries = 0; + def->entries = NULL; + return XkbComputeEffectiveMap(xkb, type, NULL); } Bool -CompileKeyTypes(XkbFile *file,XkbFileInfo *result,unsigned merge) +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; + KeyTypesInfo info; + XkbDescPtr xkb; + + xkb = result->xkb; + InitKeyTypesInfo(&info, xkb, NULL); + info.fileID = file->id; + HandleKeyTypesFile(file, xkb, merge, &info); + + if (info.errorCount == 0) + { + register int i; + register KeyTypeInfo *def; + register XkbKeyTypePtr type, next; + + if (info.name != NULL) + { + if (XkbAllocNames(xkb, XkbTypesNameMask, 0, 0) == Success) + xkb->names->types = XkbInternAtom(xkb->dpy, info.name, False); + else + { + WSGO("Couldn't allocate space for types name\n"); + ACTION2("Name \"%s\" (from %s) NOT assigned\n", + scanFile, info.name); + } + } + i = info.nTypes; + if ((info.stdPresent & XkbOneLevelMask) == 0) + i++; + if ((info.stdPresent & XkbTwoLevelMask) == 0) + i++; + if ((info.stdPresent & XkbKeypadMask) == 0) + i++; + if ((info.stdPresent & XkbAlphabeticMask) == 0) + i++; + if (XkbAllocClientMap(xkb, XkbKeyTypesMask, i) != Success) + { + WSGO("Couldn't allocate client map\n"); + ACTION("Exiting\n"); + return False; + } + xkb->map->num_types = i; + if (XkbAllRequiredTypes & (~info.stdPresent)) + { + unsigned missing, keypadVMod; + + missing = XkbAllRequiredTypes & (~info.stdPresent); + keypadVMod = FindKeypadVMod(xkb); + if (XkbInitCanonicalKeyTypes(xkb, missing, keypadVMod) != Success) + { + WSGO("Couldn't initialize canonical key types\n"); + ACTION("Exiting\n"); + return False; + } + if (missing & XkbOneLevelMask) + xkb->map->types[XkbOneLevelIndex].name = tok_ONE_LEVEL; + if (missing & XkbTwoLevelMask) + xkb->map->types[XkbTwoLevelIndex].name = tok_TWO_LEVEL; + if (missing & XkbAlphabeticMask) + xkb->map->types[XkbAlphabeticIndex].name = tok_ALPHABETIC; + if (missing & XkbKeypadMask) + xkb->map->types[XkbKeypadIndex].name = tok_KEYPAD; + } + next = &xkb->map->types[XkbLastRequiredType + 1]; + for (i = 0, def = info.types; i < info.nTypes; i++) + { + if (def->name == tok_ONE_LEVEL) + type = &xkb->map->types[XkbOneLevelIndex]; + else if (def->name == tok_TWO_LEVEL) + type = &xkb->map->types[XkbTwoLevelIndex]; + else if (def->name == tok_ALPHABETIC) + type = &xkb->map->types[XkbAlphabeticIndex]; + else if (def->name == tok_KEYPAD) + type = &xkb->map->types[XkbKeypadIndex]; + else + type = next++; + DeleteLevel1MapEntries(def); + if (!CopyDefToKeyType(xkb, type, def)) + return False; + def = (KeyTypeInfo *) def->defs.next; + } + return True; } return False; } - diff --git a/app/xkbcomp/listing.c b/app/xkbcomp/listing.c index cc887b80d..146ecbab3 100644 --- a/app/xkbcomp/listing.c +++ b/app/xkbcomp/listing.c @@ -1,4 +1,3 @@ -/* $Xorg: listing.c,v 1.5 2001/02/09 02:05:49 xorgcvs Exp $ */ /************************************************************ Copyright 1996 by Silicon Graphics Computer Systems, Inc. @@ -70,8 +69,6 @@ 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> @@ -83,19 +80,18 @@ SOFTWARE. #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> +# include <limits.h> #else -#define _POSIX_SOURCE -#include <limits.h> -#undef _POSIX_SOURCE -#endif +# define _POSIX_SOURCE +# include <limits.h> +# undef _POSIX_SOURCE #endif + #ifndef PATH_MAX #ifdef WIN32 #define PATH_MAX 512 @@ -112,28 +108,13 @@ SOFTWARE. #endif #ifdef WIN32 -#include <windows.h> -#define FileName(file) file.cFileName -#undef TEXT -#undef ALTERNATE +# 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 +# include <dirent.h> +# define FileName(file) file->d_name #endif #include "xkbpath.h" @@ -144,184 +125,213 @@ SOFTWARE. #define lowbit(x) ((x) & (-(x))) -static int szListing= 0; -static int nListed= 0; -static int nFilesListed= 0; +unsigned int listingDebug; + +static int szListing = 0; +static int nListed = 0; +static int nFilesListed = 0; -typedef struct _Listing { - char * file; - char * map; +typedef struct _Listing +{ + char *file; + char *map; } Listing; -static int szMapOnly; -static int nMapOnly; -static char ** mapOnly; +static int szMapOnly; +static int nMapOnly; +static char **mapOnly; -static Listing * list= NULL; +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; - } + 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; + mapOnly[nMapOnly++] = map; return 1; } int -AddListing(char *file,char *map) +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); - } + 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; + list[nListed].file = file; + list[nListed].map = map; nListed++; - if (file!=NULL) - nFilesListed++; + if (file != NULL) + nFilesListed++; return 1; } /***====================================================================***/ static void -ListFile(FILE *outFile,char *fileName,XkbFile *map) +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,"-------- "); + 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); + 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); + 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) +AddDirectory(char *head, char *ptrn, char *rest, char *map) { #ifdef WIN32 - HANDLE dirh; - WIN32_FIND_DATA file; + HANDLE dirh; + WIN32_FIND_DATA file; #else - DIR *dirp; - struct dirent *file; + 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'; - } + 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; + return 0; #else - if ((dirp = opendir ((head?head:"."))) == NULL) - return 0; - nMatch= 0; + if ((dirp = opendir((head ? head : "."))) == NULL) + return 0; + nMatch = 0; #endif #ifdef WIN32 do #else - while ((file = readdir (dirp)) != NULL) + 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); + 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)); @@ -334,42 +344,53 @@ AddDirectory(char *head,char *ptrn,char *rest,char *map) 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; + 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; + 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 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++; + else + { /* slash followed by wildcard */ + head = head_in; + *ptrn = '\0'; + ptrn++; } - if (ptrn) { - rest= strchr(ptrn,'/'); - if (rest!=NULL) { - *rest= '\0'; - rest++; - } + 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; + 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); + return AddDirectory(head, ptrn, rest, NULL); } /***====================================================================***/ @@ -377,15 +398,16 @@ char *str,*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; + 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; } @@ -393,70 +415,81 @@ int i; 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; + 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; + 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"); + if (warningLevel > 9) + fprintf(stderr, "should list:\n"); #endif - for (i=0;i<nListed;i++) { + 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:"*")); - } + 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; + 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/app/xkbcomp/misc.c b/app/xkbcomp/misc.c index 91688f739..4990a7439 100644 --- a/app/xkbcomp/misc.c +++ b/app/xkbcomp/misc.c @@ -1,4 +1,3 @@ -/* $Xorg: misc.c,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,7 +23,6 @@ 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" @@ -38,73 +36,95 @@ /***====================================================================***/ +/** + * Open the file given in the include statement and parse it's content. + * If the statement defines a specific map to use, this map is returned in + * file_rtrn. Otherwise, the default map is returned. + * + * @param stmt The include statement, specifying the file name to look for. + * @param file_type Type of file (XkmKeyNamesIdx, etc.) + * @param file_rtrn Returns the key map to be used. + * @param merge_rtrn Always returns stmt->merge. + * + * @return True on success or False otherwise. + */ Bool -ProcessIncludeFile( IncludeStmt * stmt, - unsigned file_type, - XkbFile ** file_rtrn, - unsigned * merge_rtrn) +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); + FILE *file; + XkbFile *rtrn, *mapToUse; + char oldFile[1024] = {0}; + int oldLine = lineNum; + + rtrn = XkbFindFileInCache(stmt->file, file_type, &stmt->path); + if (rtrn == NULL) + { + /* file not in cache, open it, parse it and store it in cache for next + time. */ + file = XkbFindFileInPath(stmt->file, file_type, &stmt->path); + if (file == NULL) + { + ERROR2("Can't find file \"%s\" for %s include\n", stmt->file, + XkbDirectoryForInclude(file_type)); + ACTION("Exiting\n"); + return False; + } + strcpy(oldFile, scanFile); + oldLine = lineNum; + setScanState(stmt->file, 1); + if (debugFlags & 2) + INFO1("About to parse include file %s\n", stmt->file); + /* parse the file */ + if ((XKBParseFile(file, &rtrn) == 0) || (rtrn == NULL)) + { + setScanState(oldFile, oldLine); + ERROR1("Error interpreting include file \"%s\"\n", stmt->file); + ACTION("Exiting\n"); + fclose(file); + return False; + } + fclose(file); + XkbAddFileToCache(stmt->file, file_type, stmt->path, rtrn); } - mapToUse= rtrn; - if (stmt->map!=NULL) { - while ((mapToUse)&&((!uStringEqual(mapToUse->name,stmt->map))|| - (mapToUse->type!=file_type))) { - mapToUse= (XkbFile *)mapToUse->common.next; - } - if (!mapToUse) { - ERROR3("No %s named \"%s\" in the include file \"%s\"\n", - XkbConfigText(file_type,XkbMessage), - stmt->map,stmt->file); - ACTION("Exiting\n"); - return False; - } + 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); + 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; + 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; + mapToUse->compiled = True; + *file_rtrn = mapToUse; + *merge_rtrn = stmt->merge; return True; } @@ -113,16 +133,16 @@ int oldLine = lineNum; 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); + 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); + ERROR2("Missing subscript for %s %s\n", type, field); + ACTION1("Ignoring illegal assignment in %s\n", name); return False; } @@ -130,373 +150,432 @@ 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); + 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) +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); + 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); + 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) +ReportMultipleDefs(char *type, char *field, char *name) { - WARN3("Multiple definitions of %s in %s \"%s\"\n",field,type,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 +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; - } + 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; + else if (newDefs->defined & field) + useNew = True; return useNew; } -Bool -MergeNewField( unsigned field, - CommonInfo * oldDefs, - CommonInfo * newDefs, - unsigned * pCollide) +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; + 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) +ClearCommonInfo(CommonInfo * cmn) { - if (cmn!=NULL) { - CommonInfo *this,*next; - for (this=cmn;this!=NULL;this=next) { - next= this->next; - uFree(this); - } + 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) +AddCommonInfo(CommonInfo * old, CommonInfo * new) { -CommonInfo * first; + CommonInfo *first; - first= old; - while ( old && old->next ) { - old= old->next; + first = old; + while (old && old->next) + { + old = old->next; } - new->next= NULL; - if (old) { - old->next= new; - return (XPointer)first; + new->next = NULL; + if (old) + { + old->next = new; + return (XPointer) first; } - return (XPointer)new; + return (XPointer) new; } /***====================================================================***/ -typedef struct _KeyNameDesc { - KeySym level1; - KeySym level2; - char name[5]; - Bool used; +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" } +static KeyNameDesc dfltKeys[] = { + {XK_Escape, NoSymbol, "ESC\0"}, + {XK_quoteleft, XK_asciitilde, "TLDE"}, + {XK_1, XK_exclam, "AE01"}, + {XK_2, XK_at, "AE02"}, + {XK_3, XK_numbersign, "AE03"}, + {XK_4, XK_dollar, "AE04"}, + {XK_5, XK_percent, "AE05"}, + {XK_6, XK_asciicircum, "AE06"}, + {XK_7, XK_ampersand, "AE07"}, + {XK_8, XK_asterisk, "AE08"}, + {XK_9, XK_parenleft, "AE09"}, + {XK_0, XK_parenright, "AE10"}, + {XK_minus, XK_underscore, "AE11"}, + {XK_equal, XK_plus, "AE12"}, + {XK_BackSpace, NoSymbol, "BKSP"}, + {XK_Tab, NoSymbol, "TAB\0"}, + {XK_q, XK_Q, "AD01"}, + {XK_w, XK_W, "AD02"}, + {XK_e, XK_E, "AD03"}, + {XK_r, XK_R, "AD04"}, + {XK_t, XK_T, "AD05"}, + {XK_y, XK_Y, "AD06"}, + {XK_u, XK_U, "AD07"}, + {XK_i, XK_I, "AD08"}, + {XK_o, XK_O, "AD09"}, + {XK_p, XK_P, "AD10"}, + {XK_bracketleft, XK_braceleft, "AD11"}, + {XK_bracketright, XK_braceright, "AD12"}, + {XK_Return, NoSymbol, "RTRN"}, + {XK_Caps_Lock, NoSymbol, "CAPS"}, + {XK_a, XK_A, "AC01"}, + {XK_s, XK_S, "AC02"}, + {XK_d, XK_D, "AC03"}, + {XK_f, XK_F, "AC04"}, + {XK_g, XK_G, "AC05"}, + {XK_h, XK_H, "AC06"}, + {XK_j, XK_J, "AC07"}, + {XK_k, XK_K, "AC08"}, + {XK_l, XK_L, "AC09"}, + {XK_semicolon, XK_colon, "AC10"}, + {XK_quoteright, XK_quotedbl, "AC11"}, + {XK_Shift_L, NoSymbol, "LFSH"}, + {XK_z, XK_Z, "AB01"}, + {XK_x, XK_X, "AB02"}, + {XK_c, XK_C, "AB03"}, + {XK_v, XK_V, "AB04"}, + {XK_b, XK_B, "AB05"}, + {XK_n, XK_N, "AB06"}, + {XK_m, XK_M, "AB07"}, + {XK_comma, XK_less, "AB08"}, + {XK_period, XK_greater, "AB09"}, + {XK_slash, XK_question, "AB10"}, + {XK_backslash, XK_bar, "BKSL"}, + {XK_Control_L, NoSymbol, "LCTL"}, + {XK_space, NoSymbol, "SPCE"}, + {XK_Shift_R, NoSymbol, "RTSH"}, + {XK_Alt_L, NoSymbol, "LALT"}, + {XK_space, NoSymbol, "SPCE"}, + {XK_Control_R, NoSymbol, "RCTL"}, + {XK_Alt_R, NoSymbol, "RALT"}, + {XK_F1, NoSymbol, "FK01"}, + {XK_F2, NoSymbol, "FK02"}, + {XK_F3, NoSymbol, "FK03"}, + {XK_F4, NoSymbol, "FK04"}, + {XK_F5, NoSymbol, "FK05"}, + {XK_F6, NoSymbol, "FK06"}, + {XK_F7, NoSymbol, "FK07"}, + {XK_F8, NoSymbol, "FK08"}, + {XK_F9, NoSymbol, "FK09"}, + {XK_F10, NoSymbol, "FK10"}, + {XK_F11, NoSymbol, "FK11"}, + {XK_F12, NoSymbol, "FK12"}, + {XK_Print, NoSymbol, "PRSC"}, + {XK_Scroll_Lock, NoSymbol, "SCLK"}, + {XK_Pause, NoSymbol, "PAUS"}, + {XK_Insert, NoSymbol, "INS\0"}, + {XK_Home, NoSymbol, "HOME"}, + {XK_Prior, NoSymbol, "PGUP"}, + {XK_Delete, NoSymbol, "DELE"}, + {XK_End, NoSymbol, "END"}, + {XK_Next, NoSymbol, "PGDN"}, + {XK_Up, NoSymbol, "UP\0\0"}, + {XK_Left, NoSymbol, "LEFT"}, + {XK_Down, NoSymbol, "DOWN"}, + {XK_Right, NoSymbol, "RGHT"}, + {XK_Num_Lock, NoSymbol, "NMLK"}, + {XK_KP_Divide, NoSymbol, "KPDV"}, + {XK_KP_Multiply, NoSymbol, "KPMU"}, + {XK_KP_Subtract, NoSymbol, "KPSU"}, + {NoSymbol, XK_KP_7, "KP7\0"}, + {NoSymbol, XK_KP_8, "KP8\0"}, + {NoSymbol, XK_KP_9, "KP9\0"}, + {XK_KP_Add, NoSymbol, "KPAD"}, + {NoSymbol, XK_KP_4, "KP4\0"}, + {NoSymbol, XK_KP_5, "KP5\0"}, + {NoSymbol, XK_KP_6, "KP6\0"}, + {NoSymbol, XK_KP_1, "KP1\0"}, + {NoSymbol, XK_KP_2, "KP2\0"}, + {NoSymbol, XK_KP_3, "KP3\0"}, + {XK_KP_Enter, NoSymbol, "KPEN"}, + {NoSymbol, XK_KP_0, "KP0\0"}, + {XK_KP_Delete, NoSymbol, "KPDL"}, + {XK_less, XK_greater, "LSGT"}, + {XK_KP_Separator, NoSymbol, "KPCO"}, + {XK_Find, NoSymbol, "FIND"}, + {NoSymbol, NoSymbol, "\0\0\0\0"} }; Status ComputeKbdDefaults(XkbDescPtr xkb) { -Status rtrn; -register int i,tmp,nUnknown; -KeyNameDesc * name; -KeySym * syms; - - if ((xkb->names==NULL)||(xkb->names->keys==NULL)) { - if ((rtrn=XkbAllocNames(xkb,XkbKeyNamesMask,0,0))!=Success) - return rtrn; + Status rtrn; + register int i, tmp, nUnknown; + KeyNameDesc *name; + KeySym *syms; + char tmpname[XkbKeyNameLength + 1]; + + if ((xkb->names == NULL) || (xkb->names->keys == NULL)) + { + if ((rtrn = XkbAllocNames(xkb, XkbKeyNamesMask, 0, 0)) != Success) + return rtrn; } - for (name=dfltKeys;(name->name[0]!='\0');name++) { - name->used= False; + 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++); - } - } - } + nUnknown = 0; + for (i = xkb->min_key_code; i <= xkb->max_key_code; i++) + { + tmp = XkbKeyNumSyms(xkb, i); + if ((xkb->names->keys[i].name[0] == '\0') && (tmp > 0)) + { + tmp = XkbKeyGroupsWidth(xkb, i); + syms = XkbKeySymsPtr(xkb, i); + for (name = dfltKeys; (name->name[0] != '\0'); name++) + { + Bool match = True; + if (((name->level1 != syms[0]) + && (name->level1 != NoSymbol)) + || ((name->level2 != NoSymbol) && (tmp < 2)) + || ((name->level2 != syms[1]) + && (name->level2 != NoSymbol))) + { + match = False; + } + if (match) + { + if (!name->used) + { + memcpy(xkb->names->keys[i].name, name->name, + XkbKeyNameLength); + name->used = True; + } + else + { + if (warningLevel > 2) + { + WARN1 + ("Several keys match pattern for %s\n", + XkbKeyNameText(name->name, XkbMessage)); + ACTION2("Using <U%03d> for key %d\n", + nUnknown, i); + } + snprintf(tmpname, sizeof(tmpname), "U%03d", + nUnknown++); + memcpy(xkb->names->keys[i].name, tmpname, + XkbKeyNameLength); + } + break; + } + } + if (xkb->names->keys[i].name[0] == '\0') + { + if (warningLevel > 2) + { + WARN1("Key %d does not match any defaults\n", i); + ACTION1("Using name <U%03d>\n", nUnknown); + snprintf(tmpname, sizeof(tmpname), "U%03d", nUnknown++); + memcpy(xkb->names->keys[i].name, tmpname, + XkbKeyNameLength); + } + } + } } return Success; } +/** + * Find the key with the given name and return its keycode in kc_rtrn. + * + * @param name The 4-letter name of the key as a long. + * @param kc_rtrn Set to the keycode if the key was found, otherwise 0. + * @param use_aliases True if the key aliases should be searched too. + * @param create If True and the key is not found, it is added to the + * xkb->names at the first free keycode. + * @param start_from Keycode to start searching from. + * + * @return True if found, False otherwise. + */ Bool -FindNamedKey( XkbDescPtr xkb, - unsigned long name, - unsigned int * kc_rtrn, - Bool use_aliases, - Bool create, - int start_from) +FindNamedKey(XkbDescPtr xkb, + unsigned long name, + unsigned int *kc_rtrn, + Bool use_aliases, Bool create, int start_from) { -register unsigned n; + register unsigned n; - if (start_from<xkb->min_key_code) { - start_from= xkb->min_key_code; + if (start_from < xkb->min_key_code) + { + start_from = xkb->min_key_code; } - else if (start_from>xkb->max_key_code) { - return False; + 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); - } + *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; - } - } + if (create) + { + if ((!xkb->names) || (!xkb->names->keys)) + { + if (xkb->min_key_code < XkbMinLegalKeyCode) + { + xkb->min_key_code = XkbMinLegalKeyCode; + xkb->max_key_code = XkbMaxLegalKeyCode; + } + if (XkbAllocNames(xkb, XkbKeyNamesMask, 0, 0) != Success) + { + if (warningLevel > 0) + { + WARN("Couldn't allocate key names in FindNamedKey\n"); + ACTION1("Key \"%s\" not automatically created\n", + longText(name, XkbMessage)); + } + return False; + } + } + /* Find first unused keycode and store our key here */ + for (n = xkb->min_key_code; n <= xkb->max_key_code; n++) + { + if (xkb->names->keys[n].name[0] == '\0') + { + char buf[XkbKeyNameLength + 1]; + LongToKeyName(name, buf); + memcpy(xkb->names->keys[n].name, buf, XkbKeyNameLength); + *kc_rtrn = n; + return True; + } + } } return False; } Bool -FindKeyNameForAlias(XkbDescPtr xkb,unsigned long lname,unsigned long *real_name) +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; - } - } + 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; - } - } + 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/app/xkbcomp/misc.h b/app/xkbcomp/misc.h index fd16db482..4fa4b6dde 100644 --- a/app/xkbcomp/misc.h +++ b/app/xkbcomp/misc.h @@ -1,4 +1,3 @@ -/* $Xorg: misc.h,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,103 +23,89 @@ 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; +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 */ -); +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/app/xkbcomp/parseutils.c b/app/xkbcomp/parseutils.c index bae18f902..4aa859dbe 100644 --- a/app/xkbcomp/parseutils.c +++ b/app/xkbcomp/parseutils.c @@ -1,4 +1,3 @@ -/* $Xorg: parseutils.c,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,725 +23,822 @@ 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> +#include <limits.h> +#include <stdlib.h> -XkbFile *rtrnValue; +XkbFile *rtrnValue; ParseCommon * -AppendStmt(ParseCommon *to,ParseCommon *append) +AppendStmt(ParseCommon * to, ParseCommon * append) { -ParseCommon *start= to; + ParseCommon *start = to; - if (append==NULL) - return to; - while ((to!=NULL) && (to->next!=NULL)) { - to= to->next; + if (append == NULL) + return to; + while ((to != NULL) && (to->next != NULL)) + { + to = to->next; } - if (to) { - to->next= append; - return start; + 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 */ +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 */ +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 */ +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) +KeycodeCreate(char *name, ExprDef * value) { -KeycodeDef *def; + 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; + 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 */ + else + { + FATAL("Couldn't allocate key name definition in parser\n"); + /* NOTREACHED */ } return def; } KeyAliasDef * -KeyAliasCreate(char *alias,char *real) +KeyAliasCreate(char *alias, char *real) { -KeyAliasDef *def; + 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'; + 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 */ + 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 */ +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 */ +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) +BoolVarCreate(Atom nameToken, unsigned set) { -ExprDef *name,*value; + ExprDef *name, *value; - name= ExprCreate(ExprIdent,TypeUnknown); - name->value.str= nameToken; - value= ExprCreate(ExprValue,TypeBoolean); - value->value.uval= set; - return VarCreate(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) +InterpCreate(KeySym sym, ExprDef * match) { -InterpDef *def; + InterpDef *def; - def= uTypedAlloc(InterpDef); - if (def) { - def->common.stmtType= StmtInterpDef; - def->common.next= NULL; - def->sym= sym; - def->match= match; + 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 */ + else + { + FATAL("Couldn't allocate interp definition in parser\n"); + /* NOTREACHED */ } return def; } KeyTypeDef * -KeyTypeCreate(Atom name,VarDef *body) +KeyTypeCreate(Atom name, VarDef * body) { -KeyTypeDef *def; + KeyTypeDef *def; - def= uTypedAlloc(KeyTypeDef); - if (def) { - def->common.stmtType= StmtKeyTypeDef; - def->common.next= NULL; - def->merge= MergeDefault; - def->name= name; - def->body= body; + 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 */ + else + { + FATAL("Couldn't allocate key type definition in parser\n"); + /* NOTREACHED */ } return def; } SymbolsDef * -SymbolsCreate(char *keyName,ExprDef *symbols) +SymbolsCreate(char *keyName, ExprDef * symbols) { -SymbolsDef *def; + 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; + 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 */ + else + { + FATAL("Couldn't allocate symbols definition in parser\n"); + /* NOTREACHED */ } return def; } GroupCompatDef * -GroupCompatCreate(int group,ExprDef *val) +GroupCompatCreate(int group, ExprDef * val) { -GroupCompatDef *def; + GroupCompatDef *def; - def= uTypedAlloc(GroupCompatDef); - if (def) { - def->common.stmtType= StmtGroupCompatDef; - def->common.next= NULL; - def->merge= MergeDefault; - def->group= group; - def->def= val; + 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 */ + else + { + FATAL("Couldn't allocate group compat definition in parser\n"); + /* NOTREACHED */ } return def; } ModMapDef * -ModMapCreate(Atom modifier,ExprDef *keys) +ModMapCreate(Atom modifier, ExprDef * keys) { -ModMapDef *def; + ModMapDef *def; - def= uTypedAlloc(ModMapDef); - if (def) { - def->common.stmtType= StmtModMapDef; - def->common.next= NULL; - def->merge= MergeDefault; - def->modifier= modifier; - def->keys= keys; + 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 */ + else + { + FATAL("Couldn't allocate mod mask definition in parser\n"); + /* NOTREACHED */ } return def; } IndicatorMapDef * -IndicatorMapCreate(Atom name,VarDef *body) +IndicatorMapCreate(Atom name, VarDef * body) { -IndicatorMapDef *def; + IndicatorMapDef *def; - def= uTypedAlloc(IndicatorMapDef); - if (def) { - def->common.stmtType= StmtIndicatorMapDef; - def->common.next= NULL; - def->merge= MergeDefault; - def->name= name; - def->body= body; + 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 */ + else + { + FATAL("Couldn't allocate indicator map definition in parser\n"); + /* NOTREACHED */ } return def; } IndicatorNameDef * -IndicatorNameCreate(int ndx,ExprDef *name,Bool virtual) +IndicatorNameCreate(int ndx, ExprDef * name, Bool virtual) { -IndicatorNameDef *def; + 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; + 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 */ + else + { + FATAL("Couldn't allocate indicator index definition in parser\n"); + /* NOTREACHED */ } return def; } ExprDef * -ActionCreate(Atom name,ExprDef *args) +ActionCreate(Atom name, ExprDef * args) { -ExprDef *act; + 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; + 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; - } +CreateKeysymList(char *sym) +{ + ExprDef *def; + + def = ExprCreate(ExprKeysymList, TypeSymbols); + if (def) + { + def->value.list.nSyms = 1; + def->value.list.szSyms = 4; + def->value.list.syms = uTypedCalloc(4, char *); + if (def->value.list.syms != NULL) + { + def->value.list.syms[0] = sym; + return def; + } } FATAL("Couldn't allocate expression for keysym list in parser\n"); return NULL; } ShapeDef * -ShapeDeclCreate(Atom name,OutlineDef *outlines) -{ -ShapeDef * shape; -OutlineDef * ol; - - shape= uTypedAlloc(ShapeDef); - if (shape!=NULL) { - bzero(shape,sizeof(ShapeDef)); - shape->common.stmtType= StmtShapeDef; - shape->common.next= NULL; - shape->merge= MergeDefault; - shape->name= name; - shape->nOutlines= 0; - shape->outlines= outlines; - for (ol=outlines;ol!=NULL;ol= (OutlineDef *)ol->common.next) { - if (ol->nPoints>0) - shape->nOutlines++; - } +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; +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) +KeyDeclCreate(char *name, ExprDef * expr) { -KeyDef * key; + 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; + 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) +KeyDeclMerge(KeyDef * into, KeyDef * from) { - into->expr= (ExprDef *)AppendStmt(&into->expr->common,&from->expr->common); - from->expr= NULL; + 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++; - } +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++; - } +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); +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++; - } +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) +DoodadCreate(unsigned type, Atom name, VarDef * body) { -DoodadDef * doodad; + 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; + 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; +AppendKeysymList(ExprDef * list, char *sym) +{ + if (list->value.list.nSyms >= list->value.list.szSyms) + { + list->value.list.szSyms *= 2; + list->value.list.syms = uTypedRecalloc(list->value.list.syms, + list->value.list.nSyms, + list->value.list.szSyms, + char *); + if (list->value.list.syms == NULL) + { + FATAL("Couldn't resize list of symbols for append\n"); + return NULL; + } + } + list->value.list.syms[list->value.list.nSyms++] = sym; return list; } int -LookupKeysym(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; +LookupKeysym(char *str, KeySym * sym_rtrn) +{ + KeySym sym; + char *tmp; + + if ((!str) || (uStrCaseCmp(str, "any") == 0) + || (uStrCaseCmp(str, "nosymbol") == 0)) + { + *sym_rtrn = NoSymbol; + return 1; + } + else if ((uStrCaseCmp(str, "none") == 0) + || (uStrCaseCmp(str, "voidsymbol") == 0)) + { + *sym_rtrn = XK_VoidSymbol; + return 1; + } + sym = XStringToKeysym(str); + if (sym != NoSymbol) + { + *sym_rtrn = sym; + return 1; + } + if (strlen(str) > 2 && str[0] == '0' && str[1] == 'x') { + sym = strtoul(str, &tmp, 16); + if (sym != ULONG_MAX && (!tmp || *tmp == '\0')) { + *sym_rtrn = sym; + return 1; + } } return 0; } IncludeStmt * -IncludeCreate(char *str,unsigned merge) -{ -IncludeStmt * incl,*first; -char * file,*map,*stmt,*tmp, *extra_data; -char nextop; -Bool haveSelf; - - haveSelf= False; - incl= first= NULL; - file= map= NULL; - tmp= str; - stmt= uStringDup(str); - while ((tmp)&&(*tmp)) { - if (XkbParseIncludeMap(&tmp,&file,&map,&nextop,&extra_data)) { - if ((file==NULL)&&(map==NULL)) { - if (haveSelf) - goto BAIL; - haveSelf= True; - } - if (first==NULL) - first= incl= uTypedAlloc(IncludeStmt); - else { - incl->next= uTypedAlloc(IncludeStmt); - incl= incl->next; - } - if (incl) { - incl->common.stmtType= StmtInclude; - incl->common.next= NULL; - incl->merge= merge; - incl->stmt= NULL; - incl->file= file; - incl->map= map; - incl->modifier= extra_data; - incl->path= NULL; - incl->next= NULL; - } - else { - WSGO("Allocation failure in IncludeCreate\n"); - ACTION("Using only part of the include\n"); - break; - } - if (nextop=='|') merge= MergeAugment; - else merge= MergeOverride; - } - else { - goto BAIL; - } - } - if (first) first->stmt= stmt; - else if (stmt) uFree(stmt); +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); + 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; + 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); + uFree(stmt); return NULL; } #ifdef DEBUG void -PrintStmtAddrs(ParseCommon *stmt) +PrintStmtAddrs(ParseCommon * stmt) { - fprintf(stderr,"0x%x",stmt); - if (stmt) { - do { - fprintf(stderr,"->0x%x",stmt->next); - stmt= stmt->next; - } while (stmt); + fprintf(stderr, "0x%x", stmt); + if (stmt) + { + do + { + fprintf(stderr, "->0x%x", stmt->next); + stmt = stmt->next; + } + while (stmt); } - fprintf(stderr,"\n"); + 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); - } - } +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; +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; +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) +unsigned +StmtSetMerge(ParseCommon * stmt, unsigned merge) { - if ((merge==MergeAltForm) && (stmt->stmtType!=StmtKeycodeDef)) { - yyerror("illegal use of 'alternate' merge mode"); - merge= MergeDefault; + if ((merge == MergeAltForm) && (stmt->stmtType != StmtKeycodeDef)) + { + yyerror("illegal use of 'alternate' merge mode"); + merge = MergeDefault; } return merge; } diff --git a/app/xkbcomp/parseutils.h b/app/xkbcomp/parseutils.h index a431fac74..0d06ce92f 100644 --- a/app/xkbcomp/parseutils.h +++ b/app/xkbcomp/parseutils.h @@ -1,4 +1,3 @@ -/* $Xorg: parseutils.h,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,7 +23,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. ********************************************************/ -/* $XFree86$ */ #ifndef XKBPARSE_H #define XKBPARSE_H 1 @@ -35,11 +33,11 @@ #include "xkbcomp.h" -extern char *scanStr; -extern int scanInt; -extern int lineNum; +extern char scanBuf[1024]; +extern int scanInt; +extern int lineNum; -extern XkbFile *rtrnValue; +extern XkbFile *rtrnValue; #ifdef DEBUG #define d(str) fprintf(stderr,"%s\n",str); @@ -52,196 +50,158 @@ extern XkbFile *rtrnValue; #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 */ -); +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(char * /* sym */ + ); + +extern ShapeDef *ShapeDeclCreate(Atom /* name */ , + OutlineDef * /* outlines */ + ); + +extern OutlineDef *OutlineCreate(Atom /* field */ , + ExprDef * /* points */ + ); + +extern KeyDef *KeyDeclCreate(char * /* name */ , + ExprDef * /* expr */ + ); + +extern KeyDef *KeyDeclMerge(KeyDef * /* into */ , + KeyDef * /* from */ + ); + +extern RowDef *RowDeclCreate(KeyDef * /* keys */ + ); + +extern SectionDef *SectionDeclCreate(Atom /* name */ , + RowDef * /* rows */ + ); + +extern OverlayKeyDef *OverlayKeyCreate(char * /* under */ , + char * /* over */ + ); + +extern OverlayDef *OverlayDeclCreate(Atom /* name */ , + OverlayKeyDef * /* rows */ + ); + +extern DoodadDef *DoodadCreate(unsigned /* type */ , + Atom /* name */ , + VarDef * /* body */ + ); + +extern ExprDef *AppendKeysymList(ExprDef * /* list */ , + char * /* sym */ + ); + +extern int LookupKeysym(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 */ -); +extern void PrintStmtAddrs(ParseCommon * /* stmt */ + ); #endif -extern int XKBParseFile( - FILE * /* file */, - XkbFile ** /* pRtrn */ -); +extern int XKBParseFile(FILE * /* file */ , + XkbFile ** /* pRtrn */ + ); -extern XkbFile *CreateXKBFile( - int /* type */, - char * /* name */, - ParseCommon * /* defs */, - unsigned /* flags */ -); +extern XkbFile *CreateXKBFile(int /* type */ , + char * /* name */ , + ParseCommon * /* defs */ , + unsigned /* flags */ + ); -extern void yyerror( - const char * /* s */ -); +extern void yyerror(const char * /* s */ + ); -extern int yywrap( - void -); +extern int yywrap(void); extern int yylex(void); extern int yyparse(void); -extern int setScanState( - char * /* file */, - int /* line */ -); +extern int setScanState(char * /* file */ , + int /* line */ + ); extern FILE *yyin; diff --git a/app/xkbcomp/symbols.c b/app/xkbcomp/symbols.c index ffc26b2fd..cac69e3d9 100644 --- a/app/xkbcomp/symbols.c +++ b/app/xkbcomp/symbols.c @@ -1,4 +1,3 @@ -/* $Xorg: symbols.c,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,11 +23,11 @@ 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 "parseutils.h" #include <X11/keysym.h> #include <X11/Xutil.h> @@ -41,9 +40,9 @@ #include "misc.h" #include "alias.h" -extern Atom tok_ONE_LEVEL; -extern Atom tok_TWO_LEVEL; -extern Atom tok_KEYPAD; +extern Atom tok_ONE_LEVEL; +extern Atom tok_TWO_LEVEL; +extern Atom tok_KEYPAD; /***====================================================================***/ @@ -60,688 +59,817 @@ extern Atom tok_KEYPAD; #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; +typedef struct _KeyInfo +{ + CommonInfo defs; + unsigned long name; /* the 4 chars of the key name, as long */ + unsigned char groupInfo; + unsigned char typesDefined; + unsigned char symsDefined; + unsigned char actsDefined; + short numLevels[XkbNumKbdGroups]; + KeySym *syms[XkbNumKbdGroups]; + XkbAction *acts[XkbNumKbdGroups]; + Atom types[XkbNumKbdGroups]; + unsigned repeat; + XkbBehavior behavior; + unsigned short vmodmap; + unsigned long nameForOverlayKey; + unsigned long allowNone; + Atom dfltType; } KeyInfo; +/** + * Init the given key info to sane values. + */ static void -InitKeyInfo(KeyInfo *info) +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; + register int i; + static char dflt[4] = "*"; + + info->defs.defined = 0; + info->defs.fileID = 0; + info->defs.merge = MergeOverride; + info->defs.next = NULL; + info->name = KeyNameToLong(dflt); + info->groupInfo = 0; + info->typesDefined = info->symsDefined = info->actsDefined = 0; + for (i = 0; i < XkbNumKbdGroups; i++) + { + info->numLevels[i] = 0; + info->types[i] = None; + info->syms[i] = NULL; + info->acts[i] = NULL; + } + info->dfltType = None; + info->behavior.type = XkbKB_Default; + info->behavior.data = 0; + info->vmodmap = 0; + info->nameForOverlayKey = 0; + info->repeat = RepeatUndefined; + info->allowNone = 0; return; } +/** + * Free memory associated with this key info and reset to sane values. + */ static void -FreeKeyInfo(KeyInfo *info) +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; + register int i; + + info->defs.defined = 0; + info->defs.fileID = 0; + info->defs.merge = MergeOverride; + info->defs.next = NULL; + info->groupInfo = 0; + info->typesDefined = info->symsDefined = info->actsDefined = 0; + for (i = 0; i < XkbNumKbdGroups; i++) + { + info->numLevels[i] = 0; + info->types[i] = None; + if (info->syms[i] != NULL) + uFree(info->syms[i]); + info->syms[i] = NULL; + if (info->acts[i] != NULL) + uFree(info->acts[i]); + info->acts[i] = NULL; + } + info->dfltType = None; + info->behavior.type = XkbKB_Default; + info->behavior.data = 0; + info->vmodmap = 0; + info->nameForOverlayKey = 0; + info->repeat = RepeatUndefined; + info->allowNone = 0; return; } +/** + * Copy old into new, optionally reset old to 0. + * If old is reset, new simply re-uses old's memory. Otherwise, the memory is + * newly allocated and new points to the new memory areas. + */ static Bool -CopyKeyInfo(KeyInfo *old,KeyInfo *new,Bool clearOld) +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)); - } - } + 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; +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; +typedef struct _SymbolsInfo +{ + char *name; /* e.g. pc+us+inet(evdev) */ + int errorCount; + unsigned fileID; + unsigned merge; + unsigned explicit_group; + unsigned groupInfo; + unsigned szKeys; + unsigned nKeys; + KeyInfo *keys; + KeyInfo dflt; + VModInfo vmods; + ActionInfo *action; + Atom groupNames[XkbNumKbdGroups]; + + ModMapEntry *modMap; + AliasInfo *aliases; } SymbolsInfo; static void -InitSymbolsInfo(SymbolsInfo *info,XkbDescPtr xkb) +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; + 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; + InitVModInfo(&info->vmods, xkb); + info->action = NULL; + info->aliases = NULL; return; } static void -FreeSymbolsInfo(SymbolsInfo *info) +FreeSymbolsInfo(SymbolsInfo * info) { -register int i; + 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)); + 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) +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; + 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) +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); + 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) +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")); + 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) +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); + 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; - } + 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); + return CopyKeyInfo(key, &info->keys[info->nKeys++], True); } static Bool -AddModMapEntry(SymbolsInfo *info,ModMapEntry *new) +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; + 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) +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++; + 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 */ -); +typedef void (*FileHandler) (XkbFile * /* rtrn */ , + XkbDescPtr /* xkb */ , + unsigned /* merge */ , + SymbolsInfo * /* included */ + ); static Bool -HandleIncludeSymbols( IncludeStmt * stmt, - XkbDescPtr xkb, - SymbolsInfo * info, - FileHandler hndlr) +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; + 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; - } - } + (*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); + *info = included; + else + { + MergeIncludedSymbols(info, &included, newMerge, xkb); + FreeSymbolsInfo(&included); } - return (info->errorCount==0); + 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 } +static LookupEntry groupNames[] = { + {"group1", 1}, + {"group2", 2}, + {"group3", 3}, + {"group4", 4}, + {"group5", 5}, + {"group6", 6}, + {"group7", 7}, + {"group8", 8}, + {NULL, 0} }; @@ -749,765 +877,885 @@ static LookupEntry groupNames[]= { #define ACTIONS 2 static Bool -GetGroupIndex( KeyInfo * key, - ExprDef * arrayNdx, - unsigned what, - unsigned * ndx_rtrn) +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; + 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) +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]--; + unsigned ndx, nSyms; + int i; + + if (!GetGroupIndex(key, arrayNdx, SYMBOLS, &ndx)) + return False; + if (value == NULL) + { + key->symsDefined |= (1 << ndx); + return True; + } + if (value->op != ExprKeysymList) + { + ERROR1("Expected a list of symbols, found %s\n", + exprOpText(value->op)); + ACTION2("Ignoring symbols for group %d of %s\n", ndx, + longText(key->name, XkbMessage)); + return False; + } + if (key->syms[ndx] != NULL) + { + WSGO2("Symbols for key %s, group %d already defined\n", + longText(key->name, XkbMessage), ndx); + return False; + } + nSyms = value->value.list.nSyms; + if (((key->numLevels[ndx] < nSyms) || (key->syms[ndx] == NULL)) && + (!ResizeKeyGroup(key, ndx, nSyms, False))) + { + WSGO2("Could not resize group %d of key %s\n", ndx, + longText(key->name, XkbMessage)); + ACTION("Symbols lost\n"); + return False; + } + key->symsDefined |= (1 << ndx); + for (i = 0; i < nSyms; i++) { + if (!LookupKeysym(value->value.list.syms[i], &key->syms[ndx][i])) { + WSGO1("Could not resolve keysym %s\n", value->value.list.syms[i]); + key->syms[ndx][i] = NoSymbol; + } + } + for (i = key->numLevels[ndx] - 1; + (i >= 0) && (key->syms[ndx][i] == NoSymbol); i--) + { + key->numLevels[ndx]--; } return True; } static Bool -AddActionsToKey( KeyInfo * key, - XkbDescPtr xkb, - char * field, - ExprDef * arrayNdx, - ExprDef * value, - SymbolsInfo * info) +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; + 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) +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; + 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 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 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 LookupEntry rgEntries[] = { + {"none", 0}, + {NULL, 0} }; static Bool -SetSymbolsField( KeyInfo * key, - XkbDescPtr xkb, - char * field, - ExprDef * arrayNdx, - ExprDef * value, - SymbolsInfo * info) +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; + 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) +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); - + 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) +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); + 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) +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); - } + 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) +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; + 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) +HandleSymbolsDef(SymbolsDef * stmt, + XkbDescPtr xkb, unsigned merge, SymbolsInfo * info) { -KeyInfo key; - + 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; + 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)) { + if (!SetExplicitGroup(info, &key)) + { info->errorCount++; return False; } - if (!AddKeySymbols(info,&key,xkb)) { - 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) +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; + 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) +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) { + 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"); + ERROR("Too many errors\n"); #endif - ACTION1("Abandoning symbols file \"%s\"\n",file->topName); - break; - } + ACTION1("Abandoning symbols file \"%s\"\n", file->topName); + break; + } } return; } static Bool -FindKeyForSymbol(XkbDescPtr xkb,KeySym sym,unsigned int *kc_rtrn) +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) ) { + 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; + if ((XkbKeySym(xkb, i, j) == sym)) + { + *kc_rtrn = i; return True; - } + } } } j++; - } while (gotOne); + } + while (gotOne); return False; } +/** + * Find the given name in the xkb->map->types and return its index. + * + * @param name The atom to search for. + * @param type_rtrn Set to the index of the name if found. + * + * @return True if found, False otherwise. + */ static Bool -FindNamedType(XkbDescPtr xkb,Atom name,unsigned *type_rtrn) +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; - } - } + 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) +KSIsLower(KeySym ks) { KeySym lower, upper; XConvertCase(ks, &lower, &upper); @@ -1518,7 +1766,7 @@ KSIsLower (KeySym ks) } static Bool -KSIsUpper (KeySym ks) +KSIsUpper(KeySym ks) { KeySym lower, upper; XConvertCase(ks, &lower, &upper); @@ -1528,394 +1776,531 @@ KSIsUpper (KeySym ks) return (ks == upper ? True : False); } +/** + * Assign a type to the given sym and return the Atom for the type assigned. + * + * Simple recipe: + * - ONE_LEVEL for width 0/1 + * - ALPHABETIC for 2 shift levels, with lower/upercase + * - KEYPAD for keypad keys. + * - TWO_LEVEL for other 2 shift level keys. + * and the same for four level keys. + * + * @param width Number of sysms in syms. + * @param syms The keysyms for the given key (must be size width). + * @param typeNameRtrn Set to the Atom of the type name. + * + * @returns True if a type could be found, False otherwise. + */ static Bool -FindAutomaticType(int width,KeySym *syms,Atom *typeNameRtrn, Bool *autoType) +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)); + if ((width == 1) || (width == 0)) + { + *typeNameRtrn = XkbInternAtom(NULL, "ONE_LEVEL", False); + *autoType = True; + } + else if (width == 2) + { + if (syms && KSIsLower(syms[0]) && KSIsUpper(syms[1])) + { + *typeNameRtrn = XkbInternAtom(NULL, "ALPHABETIC", False); + } + else if (syms && (XkbKSIsKeypad(syms[0]) || XkbKSIsKeypad(syms[1]))) + { + *typeNameRtrn = XkbInternAtom(NULL, "KEYPAD", False); + *autoType = True; + } + else + { + *typeNameRtrn = XkbInternAtom(NULL, "TWO_LEVEL", False); + *autoType = True; + } + } + else if (width <= 4) + { + if (syms && KSIsLower(syms[0]) && KSIsUpper(syms[1])) + if (KSIsLower(syms[2]) && KSIsUpper(syms[3])) + *typeNameRtrn = + XkbInternAtom(NULL, "FOUR_LEVEL_ALPHABETIC", False); + else + *typeNameRtrn = XkbInternAtom(NULL, + "FOUR_LEVEL_SEMIALPHABETIC", + False); + + else if (syms && (XkbKSIsKeypad(syms[0]) || XkbKSIsKeypad(syms[1]))) + *typeNameRtrn = XkbInternAtom(NULL, "FOUR_LEVEL_KEYPAD", False); + else + *typeNameRtrn = XkbInternAtom(NULL, "FOUR_LEVEL", False); + /* XXX: why not set autoType here? */ + } + return ((width >= 0) && (width <= 4)); } +/** + * Ensure the given KeyInfo is in a coherent state, i.e. no gaps between the + * groups, and reduce to one group if all groups are identical anyway. + */ static void -PrepareKeyDef(KeyInfo *key) +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; + /* get highest group number */ + for (i = XkbNumKbdGroups - 1; i >= 0; i--) + { + if (defined & (1 << i)) + break; } lastGroup = i; if (lastGroup == 0) - return; + 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)) + 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++) { + 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->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->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) { + 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--) { + for (i = lastGroup; i > 0; i--) + { if ((key->numLevels[i] != key->numLevels[0]) || - (key->types[i] != key->types[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; - } + (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]))) { + (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; + } + } + if (identical) + { + for (i = lastGroup; i > 0; i--) + { + key->numLevels[i] = 0; + if (key->syms[i] != NULL) + uFree(key->syms[i]); + key->syms[i] = (KeySym *) NULL; + if (key->acts[i] != NULL) + uFree(key->acts[i]); + key->acts[i] = (XkbAction *) NULL; + key->types[i] = (Atom) 0; + } + key->symsDefined &= 1; + key->actsDefined &= 1; + key->typesDefined &= 1; } return; } +/** + * Copy the KeyInfo into result. + * + * This function recurses. + */ static Bool -CopySymbolsDef(XkbFileInfo *result,KeyInfo *key,int start_from) +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); + register int i; + unsigned okc, kc, width, tmp, nGroups; + XkbKeyTypePtr type; + Bool haveActions, autoType, useAlias; + KeySym *outSyms; + XkbAction *outActs; + XkbDescPtr xkb; + unsigned types[XkbNumKbdGroups]; + + xkb = result->xkb; + useAlias = (start_from == 0); + + /* get the keycode for the key. */ + if (!FindNamedKey(xkb, key->name, &kc, useAlias, CreateKeyNames(xkb), + start_from)) + { + if ((start_from == 0) && (warningLevel >= 5)) + { + WARN2("Key %s not found in %s keycodes\n", + longText(key->name, XkbMessage), + XkbAtomText(NULL, xkb->names->keycodes, XkbMessage)); + ACTION("Symbols ignored\n"); + } + return False; + } + + haveActions = False; + for (i = width = nGroups = 0; i < XkbNumKbdGroups; i++) + { + if (((i + 1) > nGroups) + && (((key->symsDefined | key->actsDefined) & (1 << i)) + || (key->typesDefined) & (1 << i))) + nGroups = i + 1; + if (key->acts[i]) + haveActions = True; + autoType = False; + /* Assign the type to the key, if it is missing. */ + if (key->types[i] == None) + { + if (key->dfltType != None) + key->types[i] = key->dfltType; + else if (FindAutomaticType(key->numLevels[i], key->syms[i], + &key->types[i], &autoType)) + { + } + else + { + if (warningLevel >= 5) + { + WARN1("No automatic type for %d symbols\n", + (unsigned int) key->numLevels[i]); + ACTION3("Using %s for the %s key (keycode %d)\n", + XkbAtomText(NULL, key->types[i], + XkbMessage), + longText(key->name, XkbMessage), kc); + } + } + } + if (FindNamedType(xkb, key->types[i], &types[i])) + { + if (!autoType || key->numLevels[i] > 2) + xkb->server->explicit[kc] |= (1 << i); + } + else + { + if (warningLevel >= 3) + { + WARN1("Type \"%s\" is not defined\n", + XkbAtomText(NULL, key->types[i], XkbMessage)); + ACTION2("Using TWO_LEVEL for the %s key (keycode %d)\n", + longText(key->name, XkbMessage), kc); + } + types[i] = XkbTwoLevelIndex; + } + /* if the type specifies less syms than the key has, shrink the key */ + type = &xkb->map->types[types[i]]; + if (type->num_levels < key->numLevels[i]) + { + if (warningLevel > 0) + { + WARN4 + ("Type \"%s\" has %d levels, but %s has %d symbols\n", + XkbAtomText(NULL, type->name, XkbMessage), + (unsigned int) type->num_levels, + longText(key->name, XkbMessage), + (unsigned int) key->numLevels[i]); + ACTION("Ignoring extra symbols\n"); + } + key->numLevels[i] = type->num_levels; + } + if (key->numLevels[i] > width) + width = key->numLevels[i]; + if (type->num_levels > width) + width = type->num_levels; + } + + /* width is now the largest width found */ + + i = width * nGroups; + outSyms = XkbResizeKeySyms(xkb, kc, i); + if (outSyms == NULL) + { + WSGO2("Could not enlarge symbols for %s (keycode %d)\n", + longText(key->name, XkbMessage), kc); + return False; + } + if (haveActions) + { + outActs = XkbResizeKeyActions(xkb, kc, i); + if (outActs == NULL) + { + WSGO2("Could not enlarge actions for %s (key %d)\n", + longText(key->name, XkbMessage), kc); + return False; + } + xkb->server->explicit[kc] |= XkbExplicitInterpretMask; + } + else + outActs = NULL; + if (key->defs.defined & _Key_GroupInfo) + i = key->groupInfo; + else + i = xkb->map->key_sym_map[kc].group_info; + + xkb->map->key_sym_map[kc].group_info = XkbSetNumGroups(i, nGroups); + xkb->map->key_sym_map[kc].width = width; + for (i = 0; i < nGroups; i++) + { + /* assign kt_index[i] to the index of the type in map->types. + * kt_index[i] may have been set by a previous run (if we have two + * layouts specified). Let's not overwrite it with the ONE_LEVEL + * default group if we dont even have keys for this group anyway. + * + * FIXME: There should be a better fix for this. + */ + if (key->numLevels[i]) + xkb->map->key_sym_map[kc].kt_index[i] = types[i]; + if (key->syms[i] != NULL) + { + /* fill key to "width" symbols*/ + for (tmp = 0; tmp < width; tmp++) + { + if (tmp < key->numLevels[i]) + outSyms[tmp] = key->syms[i][tmp]; + else + outSyms[tmp] = NoSymbol; + if ((outActs != NULL) && (key->acts[i] != NULL)) + { + if (tmp < key->numLevels[i]) + outActs[tmp] = key->acts[i][tmp]; + else + outActs[tmp].type = XkbSA_NoAction; + } + } + } + outSyms += width; + if (outActs) + outActs += width; + } + switch (key->behavior.type & XkbKB_OpMask) + { + case XkbKB_Default: + break; + case XkbKB_Overlay1: + case XkbKB_Overlay2: + /* find key by name! */ + if (!FindNamedKey(xkb, key->nameForOverlayKey, &okc, True, + CreateKeyNames(xkb), 0)) + { + if (warningLevel >= 1) + { + WARN2("Key %s not found in %s keycodes\n", + longText(key->nameForOverlayKey, XkbMessage), + XkbAtomText(NULL, xkb->names->keycodes, XkbMessage)); + ACTION1("Not treating %s as an overlay key \n", + longText(key->name, XkbMessage)); + } + break; + } + key->behavior.data = okc; + default: + xkb->server->behaviors[kc] = key->behavior; + xkb->server->explicit[kc] |= XkbExplicitBehaviorMask; + break; + } + if (key->defs.defined & _Key_VModMap) + { + xkb->server->vmodmap[kc] = key->vmodmap; + xkb->server->explicit[kc] |= XkbExplicitVModMapMask; + } + if (key->repeat != RepeatUndefined) + { + if (key->repeat == RepeatYes) + xkb->ctrls->per_key_repeat[kc / 8] |= (1 << (kc % 8)); + else + xkb->ctrls->per_key_repeat[kc / 8] &= ~(1 << (kc % 8)); + xkb->server->explicit[kc] |= XkbExplicitAutoRepeatMask; + } + + /* do the same thing for the next key */ + CopySymbolsDef(result, key, kc + 1); return True; } static Bool -CopyModMapDef(XkbFileInfo *result,ModMapEntry *entry) +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); + unsigned kc; + XkbDescPtr xkb; + + xkb = result->xkb; + if ((!entry->haveSymbol) + && + (!FindNamedKey + (xkb, entry->u.keyName, &kc, True, CreateKeyNames(xkb), 0))) + { + if (warningLevel >= 5) + { + WARN2("Key %s not found in %s keycodes\n", + longText(entry->u.keyName, XkbMessage), + XkbAtomText(NULL, xkb->names->keycodes, XkbMessage)); + ACTION1("Modifier map entry for %s not updated\n", + XkbModIndexText(entry->modifier, XkbMessage)); + } + return False; + } + else if (entry->haveSymbol + && (!FindKeyForSymbol(xkb, entry->u.keySym, &kc))) + { + if (warningLevel > 5) + { + WARN2("Key \"%s\" not found in %s symbol map\n", + XkbKeysymText(entry->u.keySym, XkbMessage), + XkbAtomText(NULL, xkb->names->symbols, XkbMessage)); + ACTION1("Modifier map entry for %s not updated\n", + XkbModIndexText(entry->modifier, XkbMessage)); + } + return False; + } + xkb->map->modmap[kc] |= (1 << entry->modifier); return True; } +/** + * Handle the xkb_symbols section of an xkb file. + * + * @param file The parsed xkb_symbols section of the xkb file. + * @param result Handle to the data to store the result in. + * @param merge Merge strategy (e.g. MergeOverride). + */ Bool -CompileSymbols(XkbFile *file,XkbFileInfo *result,unsigned merge) +CompileSymbols(XkbFile * file, XkbFileInfo * result, unsigned merge) { -register int i; -SymbolsInfo info; -XkbDescPtr xkb; + 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); + 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; + if (info.errorCount == 0) + { + KeyInfo *key; + + /* alloc memory in the xkb struct */ + if (XkbAllocNames(xkb, XkbSymbolsNameMask | XkbGroupNamesMask, 0, 0) + != Success) + { + WSGO("Can not allocate names in CompileSymbols\n"); + ACTION("Symbols not added\n"); + return False; + } + if (XkbAllocClientMap(xkb, XkbKeySymsMask | XkbModifierMapMask, 0) + != Success) + { + WSGO("Could not allocate client map in CompileSymbols\n"); + ACTION("Symbols not added\n"); + return False; + } + if (XkbAllocServerMap(xkb, XkbAllServerInfoMask, 32) != Success) + { + WSGO("Could not allocate server map in CompileSymbols\n"); + ACTION("Symbols not added\n"); + return False; + } + if (XkbAllocControls(xkb, XkbPerKeyRepeatMask) != Success) + { + WSGO("Could not allocate controls in CompileSymbols\n"); + ACTION("Symbols not added\n"); + return False; + } + + /* now copy info into xkb. */ + xkb->names->symbols = XkbInternAtom(xkb->dpy, info.name, False); + if (info.aliases) + ApplyAliases(xkb, False, &info.aliases); + for (i = 0; i < XkbNumKbdGroups; i++) + { + if (info.groupNames[i] != None) + xkb->names->groups[i] = info.groupNames[i]; + } + /* sanitize keys */ + for (key = info.keys, i = 0; i < info.nKeys; i++, key++) + { + PrepareKeyDef(key); + } + /* copy! */ + for (key = info.keys, i = 0; i < info.nKeys; i++, key++) + { + if (!CopySymbolsDef(result, key, 0)) + info.errorCount++; + } + if (warningLevel > 3) + { + for (i = xkb->min_key_code; i <= xkb->max_key_code; i++) + { + if (xkb->names->keys[i].name[0] == '\0') + continue; + if (XkbKeyNumGroups(xkb, i) < 1) + { + char buf[5]; + memcpy(buf, xkb->names->keys[i].name, 4); + buf[4] = '\0'; + WARN2 + ("No symbols defined for <%s> (keycode %d)\n", + buf, i); + } + } + } + if (info.modMap) + { + ModMapEntry *mm, *next; + for (mm = info.modMap; mm != NULL; mm = next) + { + if (!CopyModMapDef(result, mm)) + info.errorCount++; + next = (ModMapEntry *) mm->defs.next; + } + } + return True; } return False; } diff --git a/app/xkbcomp/tokens.h b/app/xkbcomp/tokens.h index c63c393a7..970f3d4de 100644 --- a/app/xkbcomp/tokens.h +++ b/app/xkbcomp/tokens.h @@ -1,4 +1,3 @@ -/* $Xorg: tokens.h,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -97,4 +96,9 @@ #define FUNCTION_KEYS 76 #define ALTERNATE_GROUP 77 +extern Atom tok_ONE_LEVEL; +extern Atom tok_TWO_LEVEL; +extern Atom tok_ALPHABETIC; +extern Atom tok_KEYPAD; + #endif diff --git a/app/xkbcomp/utils.c b/app/xkbcomp/utils.c index aa4dc8987..55efbe11f 100644 --- a/app/xkbcomp/utils.c +++ b/app/xkbcomp/utils.c @@ -1,11 +1,10 @@ /*\ - * $Xorg: utils.c,v 1.4 2000/08/17 19:54:33 cpqbld Exp $ * - * COPYRIGHT 1990 - * DIGITAL EQUIPMENT CORPORATION - * MAYNARD, MASSACHUSETTS - * ALL RIGHTS RESERVED. + * 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. @@ -24,8 +23,7 @@ * 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> @@ -37,43 +35,46 @@ Opaque uAlloc(unsigned size) { - return((Opaque)malloc(size)); + return ((Opaque) malloc(size)); } /***====================================================================***/ Opaque -uCalloc(unsigned n,unsigned size) +uCalloc(unsigned n, unsigned size) { - return((Opaque)calloc(n,size)); + return ((Opaque) calloc(n, size)); } /***====================================================================***/ Opaque -uRealloc(Opaque old,unsigned newSize) +uRealloc(Opaque old, unsigned newSize) { - if (old==NULL) - return((Opaque)malloc(newSize)); - else return((Opaque)realloc((char *)old,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) +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); - } + 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; + return (Opaque) rtrn; } /***====================================================================***/ @@ -81,8 +82,8 @@ char *rtrn; void uFree(Opaque ptr) { - if (ptr!=(Opaque)NULL) - free((char *)ptr); + if (ptr != (Opaque) NULL) + free((char *) ptr); return; } @@ -90,51 +91,58 @@ uFree(Opaque ptr) /*** FUNCTION ENTRY TRACKING ***/ /***====================================================================***/ -static FILE *entryFile= NULL; - int uEntryLevel; +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 ((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); + if (name != NullString) + entryFile = fopen(name, "w"); + else + entryFile = stderr; + if (entryFile == NULL) + { + entryFile = stderr; + return (False); } - return(True); + return (True); } void -uEntry(int l,char *s,...) +uEntry(int l, char *s, ...) { -int i; -va_list args; + int i; + va_list args; - for (i=0;i<uEntryLevel;i++) { - putc(' ',entryFile); + for (i = 0; i < uEntryLevel; i++) + { + putc(' ', entryFile); } va_start(args, s); - vfprintf(entryFile,s,args); + vfprintf(entryFile, s, args); va_end(args); - uEntryLevel+= l; + uEntryLevel += l; } void -uExit(int l,char *rtVal) +uExit(int l, char *rtVal) { -int i; - - uEntryLevel-= l; - if (uEntryLevel<0) uEntryLevel= 0; - for (i=0;i<uEntryLevel;i++) { - putc(' ',entryFile); + int i; + + uEntryLevel -= l; + if (uEntryLevel < 0) + uEntryLevel = 0; + for (i = 0; i < uEntryLevel; i++) + { + putc(' ', entryFile); } - fprintf(entryFile,"---> %p\n",rtVal); + fprintf(entryFile, "---> %p\n", rtVal); return; } @@ -142,83 +150,92 @@ int i; /*** PRINT FUNCTIONS ***/ /***====================================================================***/ - FILE *uDebugFile= NULL; - int uDebugIndentLevel= 0; - int uDebugIndentSize= 4; +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 ((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); + if (name != NullString) + uDebugFile = fopen(name, "w"); + else + uDebugFile = stderr; + if (uDebugFile == NULL) + { + uDebugFile = stderr; + return (False); } - return(True); + return (True); } void -uDebug(char *s,...) +uDebug(char *s, ...) { -int i; -va_list args; + int i; + va_list args; - for (i=(uDebugIndentLevel*uDebugIndentSize);i>0;i--) { - putc(' ',uDebugFile); + for (i = (uDebugIndentLevel * uDebugIndentSize); i > 0; i--) + { + putc(' ', uDebugFile); } va_start(args, s); - vfprintf(uDebugFile,s,args); + vfprintf(uDebugFile, s, args); va_end(args); fflush(uDebugFile); } void -uDebugNOI(char *s,...) +uDebugNOI(char *s, ...) { -va_list args; + va_list args; va_start(args, s); - vfprintf(uDebugFile,s,args); + 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; +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 ((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); + if (name != NullString) + errorFile = fopen(name, "w"); + else + errorFile = stderr; + if (errorFile == NULL) + { + errorFile = stderr; + return (False); } - return(True); + return (True); } void uInformation(const char *s, ...) { -va_list args; + va_list args; va_start(args, s); - vfprintf(errorFile,s,args); + vfprintf(errorFile, s, args); va_end(args); fflush(errorFile); } @@ -228,13 +245,13 @@ va_list args; void uAction(const char *s, ...) { -va_list args; + va_list args; - if (prefix!=NULL) - fprintf(errorFile,"%s",prefix); - fprintf(errorFile," "); + if (prefix != NULL) + fprintf(errorFile, "%s", prefix); + fprintf(errorFile, " "); va_start(args, s); - vfprintf(errorFile,s,args); + vfprintf(errorFile, s, args); va_end(args); fflush(errorFile); } @@ -244,15 +261,15 @@ va_list args; void uWarning(const char *s, ...) { -va_list args; + va_list args; - if ((outCount==0)&&(preMsg!=NULL)) - fprintf(errorFile,"%s\n",preMsg); - if (prefix!=NULL) - fprintf(errorFile,"%s",prefix); - fprintf(errorFile,"Warning: "); + 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); + vfprintf(errorFile, s, args); va_end(args); fflush(errorFile); outCount++; @@ -263,15 +280,15 @@ va_list args; void uError(const char *s, ...) { -va_list args; + va_list args; - if ((outCount==0)&&(preMsg!=NULL)) - fprintf(errorFile,"%s\n",preMsg); - if (prefix!=NULL) - fprintf(errorFile,"%s",prefix); - fprintf(errorFile,"Error: "); + 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); + vfprintf(errorFile, s, args); va_end(args); fflush(errorFile); outCount++; @@ -282,17 +299,17 @@ va_list args; void uFatalError(const char *s, ...) { -va_list args; + va_list args; - if ((outCount==0)&&(preMsg!=NULL)) - fprintf(errorFile,"%s\n",preMsg); - if (prefix!=NULL) - fprintf(errorFile,"%s",prefix); - fprintf(errorFile,"Fatal Error: "); + 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); + vfprintf(errorFile, s, args); va_end(args); - fprintf(errorFile," Exiting\n"); + fprintf(errorFile, " Exiting\n"); fflush(errorFile); outCount++; exit(1); @@ -304,15 +321,15 @@ va_list args; void uInternalError(const char *s, ...) { -va_list args; + va_list args; - if ((outCount==0)&&(preMsg!=NULL)) - fprintf(errorFile,"%s\n",preMsg); - if (prefix!=NULL) - fprintf(errorFile,"%s",prefix); - fprintf(errorFile,"Internal error: "); + 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); + vfprintf(errorFile, s, args); va_end(args); fflush(errorFile); outCount++; @@ -321,30 +338,30 @@ va_list args; void uSetPreErrorMessage(char *msg) { - outCount= 0; - preMsg= msg; + outCount = 0; + preMsg = msg; return; } void uSetPostErrorMessage(char *msg) { - postMsg= msg; + postMsg = msg; return; } void uSetErrorPrefix(char *pre) { - prefix= pre; + prefix = pre; return; } void uFinishUp(void) { - if ((outCount>0)&&(postMsg!=NULL)) - fprintf(errorFile,"%s\n",postMsg); + if ((outCount > 0) && (postMsg != NULL)) + fprintf(errorFile, "%s\n", postMsg); return; } @@ -354,12 +371,12 @@ uFinishUp(void) char * uStringDup(const char *str) { -char *rtrn; + char *rtrn; - if (str==NULL) - return NULL; - rtrn= (char *)uAlloc(strlen(str)+1); - strcpy(rtrn,str); + if (str == NULL) + return NULL; + rtrn = (char *) uAlloc(strlen(str) + 1); + strcpy(rtrn, str); return rtrn; } #endif @@ -368,24 +385,26 @@ char *rtrn; int uStrCaseCmp(const char *str1, const char *str2) { - char buf1[512],buf2[512]; + 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; + 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; + 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)); @@ -396,15 +415,19 @@ 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++; + 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; + if (c1 != '\0') + return 0; return 1; } diff --git a/app/xkbcomp/utils.h b/app/xkbcomp/utils.h index ab84a4f7b..65e37c8a5 100644 --- a/app/xkbcomp/utils.h +++ b/app/xkbcomp/utils.h @@ -2,12 +2,11 @@ #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. + * 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. @@ -26,8 +25,7 @@ * 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 $ */ + \*/ /***====================================================================***/ @@ -37,6 +35,7 @@ #include <X11/Xfuncs.h> #include <stddef.h> +#include "config.h" #ifndef NUL #define NUL '\0' @@ -45,14 +44,14 @@ /***====================================================================***/ #ifndef OPAQUE_DEFINED -typedef void *Opaque; +typedef void *Opaque; #endif #ifndef NullOpaque #define NullOpaque ((Opaque)NULL) #endif #ifndef BOOLEAN_DEFINED -typedef char Boolean; +typedef char Boolean; #endif #ifndef True @@ -62,7 +61,7 @@ typedef char Boolean; #define booleanText(b) ((b)?"True":"False") #ifndef COMPARISON_DEFINED -typedef int Comparison; +typedef int Comparison; #define Greater ((Comparison)1) #define Equal ((Comparison)0) @@ -71,37 +70,23 @@ typedef int Comparison; #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 */ -); +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))) @@ -117,9 +102,8 @@ extern void uFree( /***====================================================================***/ -extern Boolean uSetErrorFile( - char * /* name */ -); +extern Boolean uSetErrorFile(char * /* name */ + ); #define INFO6 uInformation #define INFO5 uInformation @@ -129,14 +113,14 @@ extern Boolean uSetErrorFile( #define INFO1 uInformation #define INFO uInformation -extern void uInformation( - const char * /* s */, ... -) +extern void +uInformation(const char * /* s */ , ... + ) #if defined(__GNUC__) && \ ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) -__attribute__((format(printf, 1, 2))) + __attribute__ ((format(printf, 1, 2))) #endif -; + ; #define ACTION6 uAction #define ACTION5 uAction @@ -146,14 +130,13 @@ __attribute__((format(printf, 1, 2))) #define ACTION1 uAction #define ACTION uAction -extern void uAction( - const char * /* s */, ... -) + extern void uAction(const char * /* s */ , ... + ) #if defined(__GNUC__) && \ ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) -__attribute__((format(printf, 1, 2))) + __attribute__ ((format(printf, 1, 2))) #endif -; + ; #define WARN6 uWarning #define WARN5 uWarning @@ -163,14 +146,13 @@ __attribute__((format(printf, 1, 2))) #define WARN1 uWarning #define WARN uWarning -extern void uWarning( - const char * /* s */, ... -) + extern void uWarning(const char * /* s */ , ... + ) #if defined(__GNUC__) && \ ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) -__attribute__((format(printf, 1, 2))) + __attribute__ ((format(printf, 1, 2))) #endif -; + ; #define ERROR6 uError #define ERROR5 uError @@ -180,14 +162,13 @@ __attribute__((format(printf, 1, 2))) #define ERROR1 uError #define ERROR uError -extern void uError( - const char * /* s */, ... -) + extern void uError(const char * /* s */ , ... + ) #if defined(__GNUC__) && \ ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) -__attribute__((format(printf, 1, 2))) + __attribute__ ((format(printf, 1, 2))) #endif -; + ; #define FATAL6 uFatalError #define FATAL5 uFatalError @@ -197,14 +178,13 @@ __attribute__((format(printf, 1, 2))) #define FATAL1 uFatalError #define FATAL uFatalError -extern void uFatalError( - const char * /* s */, ... -) + extern void uFatalError(const char * /* s */ , ... + ) #if defined(__GNUC__) && \ ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) -__attribute__((format(printf, 1, 2))) + __attribute__ ((format(printf, 1, 2))) #endif -; + ; /* WSGO stands for "Weird Stuff Going On" */ #define WSGO6 uInternalError @@ -215,30 +195,24 @@ __attribute__((format(printf, 1, 2))) #define WSGO1 uInternalError #define WSGO uInternalError -extern void uInternalError( - const char * /* s */, ... -) + extern void uInternalError(const char * /* s */ , ... + ) #if defined(__GNUC__) && \ ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) -__attribute__((format(printf, 1, 2))) + __attribute__ ((format(printf, 1, 2))) #endif -; + ; -extern void uSetPreErrorMessage( - char * /* msg */ -); + extern void uSetPreErrorMessage(char * /* msg */ + ); -extern void uSetPostErrorMessage( - char * /* msg */ -); + extern void uSetPostErrorMessage(char * /* msg */ + ); -extern void uSetErrorPrefix( - char * /* void */ -); + extern void uSetErrorPrefix(char * /* void */ + ); -extern void uFinishUp( - void -); + extern void uFinishUp(void); /***====================================================================***/ @@ -255,21 +229,18 @@ extern void uFinishUp( #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 */ -); + 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)) +#define uStringDup(s1) ((s1) ? strdup(s1) : NULL) #else -extern char *uStringDup( - const char * /* s1 */ -); + extern char *uStringDup(const char * /* s1 */ + ); #endif /***====================================================================***/ @@ -287,36 +258,31 @@ extern char *uStringDup( #define DEBUG_VAR debugFlags #endif -#ifdef DEBUG_VAR_NOT_LOCAL extern -#endif -unsigned int DEBUG_VAR; + unsigned int DEBUG_VAR; -extern void uDebug( - char * /* s */, ... -) + extern void uDebug(char * /* s */ , ... + ) #if defined(__GNUC__) && \ ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) -__attribute__((format(printf, 1, 2))) + __attribute__ ((format(printf, 1, 2))) #endif -; + ; -extern void uDebugNOI( /* no indent */ - char * /* s */, ... -) + extern void uDebugNOI( /* no indent */ + char * /* s */ , ... + ) #if defined(__GNUC__) && \ ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) -__attribute__((format(printf, 1, 2))) + __attribute__ ((format(printf, 1, 2))) #endif -; + ; -extern Boolean uSetDebugFile( - char *name -); + extern Boolean uSetDebugFile(char *name); -extern FILE *uDebugFile; -extern int uDebugIndentLevel; -extern int uDebugIndentSize; + extern FILE *uDebugFile; + extern int uDebugIndentLevel; + extern int uDebugIndentSize; #define uDebugIndent(l) (uDebugIndentLevel+=(l)) #define uDebugOutdent(l) (uDebugIndentLevel-=(l)) #ifdef DEBUG_ON @@ -347,29 +313,24 @@ extern int uDebugIndentSize; #define uDEBUG_NOI5(f,s,a,b,c,d,e) #endif -extern Boolean uSetEntryFile( - char *name -); -extern void uEntry( - int /* l */, - char * /* s */, ... -) + 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))) + __attribute__ ((format(printf, 2, 3))) #endif -; + ; -extern void uExit( - int l,char *rtVal -); + 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; + extern int uEntryLevel; #define uENTRY(s) { if (ENTER) uEntry(1,s);} #define uENTRY1(s,a) { if (ENTER) uEntry(1,s,a);} @@ -414,9 +375,7 @@ extern int uEntryLevel; #define uFLAG_ENTRY7(f,s,a,b,c,d,e,g,h) #define uFLAG_RETURN(v) { return(v);} #define uFLAG_VOIDRETURN { return; } -#endif +#endif #endif /* UTILS_H */ - - diff --git a/app/xkbcomp/vmod.c b/app/xkbcomp/vmod.c index 9a8bd0d87..5578fd01f 100644 --- a/app/xkbcomp/vmod.c +++ b/app/xkbcomp/vmod.c @@ -1,4 +1,3 @@ -/* $Xorg: vmod.c,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,9 +23,7 @@ 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" @@ -40,144 +37,190 @@ #include "vmod.h" void -InitVModInfo(VModInfo *info,XkbDescPtr xkb) +InitVModInfo(VModInfo * info, XkbDescPtr xkb) { - ClearVModInfo(info,xkb); - info->errorCount= 0; + ClearVModInfo(info, xkb); + info->errorCount = 0; return; } void -ClearVModInfo(VModInfo *info,XkbDescPtr xkb) +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; - } + register int i; + + if (XkbAllocNames(xkb, XkbVirtualModNamesMask, 0, 0) != Success) + return; + if (XkbAllocServerMap(xkb, XkbVirtualModsMask, 0) != Success) + return; + info->xkb = xkb; + info->newlyDefined = info->defined = info->available = 0; + if (xkb && xkb->names) + { + register int bit; + for (i = 0, bit = 1; i < XkbNumVirtualMods; i++, bit <<= 1) + { + if (xkb->names->vmods[i] != None) + info->defined |= bit; + } } return; } /***====================================================================***/ +/** + * Handle one entry in the virtualModifiers line (e.g. NumLock). + * If the entry is e.g. NumLock=Mod1, stmt->value is not NULL, and the + * XkbServerMap's vmod is set to the given modifier. Otherwise, the vmod is 0. + * + * @param stmt The statement specifying the name and (if any the value). + * @param mergeMode Merge strategy (e.g. MergeOverride) + */ Bool -HandleVModDef(VModDef *stmt,unsigned mergeMode,VModInfo *info) +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; + 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; + 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; + 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)); + XkbAtomText(NULL, stmt->name, XkbMessage)); return False; } +/** + * Returns the index of the given modifier in the xkb->names->vmods array. + * + * @param priv Pointer to the xkb data structure. + * @param elem Must be None, otherwise return False. + * @param field The Atom of the modifier's name (e.g. Atom for LAlt) + * @param type Must be TypeInt, otherwise return False. + * @param val_rtrn Set to the index of the modifier that matches. + * + * @return True on success, False otherwise. If False is returned, val_rtrn is + * undefined. + */ int -LookupVModIndex( XPointer priv, - Atom elem, - Atom field, - unsigned type, - ExprResult * val_rtrn) +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; + 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; - } + /* get the actual name */ + fieldStr = XkbAtomGetString(xkb->dpy, field); + if (fieldStr == NULL) + return False; + /* For each named modifier, get the name and compare it to the one passed + * in. If we get a match, return the index of the modifier. + * The order of modifiers is the same as in the virtual_modifiers line in + * the xkb_types section. + */ + for (i = 0; i < XkbNumVirtualMods; i++) + { + modStr = XkbAtomGetString(xkb->dpy, xkb->names->vmods[i]); + if ((modStr != NULL) && (uStrCaseCmp(fieldStr, modStr) == 0)) + { + val_rtrn->uval = i; + return True; + } } return False; } +/** + * Get the mask for the given modifier and set val_rtrn.uval to the mask. + * Note that the mask returned is always > 512. + * + * @param priv Pointer to xkb data structure. + * @param val_rtrn Set to the mask returned. + * + * @return True on success, False otherwise. If False is returned, val_rtrn is + * undefined. + */ int -LookupVModMask( XPointer priv, - Atom elem, - Atom field, - unsigned type, - ExprResult * val_rtrn) +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; + if (LookupVModIndex(priv, elem, field, type, val_rtrn)) + { + register unsigned ndx = val_rtrn->uval; + val_rtrn->uval = (1 << (XkbNumModifiers + ndx)); + return True; } return False; } @@ -185,41 +228,44 @@ LookupVModMask( XPointer priv, int FindKeypadVMod(XkbDescPtr xkb) { -Atom name; -ExprResult rtrn; + Atom name; + ExprResult rtrn; - name= XkbInternAtom(xkb->dpy,"NumLock",False); - if ((xkb)&& - LookupVModIndex((XPointer)xkb,None,name,TypeInt,&rtrn)) { - return rtrn.ival; + 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) +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; - } - } + 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); + 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/app/xkbcomp/vmod.h b/app/xkbcomp/vmod.h index 231d2c8ba..559b9d504 100644 --- a/app/xkbcomp/vmod.h +++ b/app/xkbcomp/vmod.h @@ -1,4 +1,3 @@ -/* $Xorg: vmod.h,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,64 +23,56 @@ 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; +typedef struct _VModInfo +{ + XkbDescPtr xkb; + unsigned defined; + unsigned available; + unsigned newlyDefined; + int errorCount; } VModInfo; -extern void InitVModInfo( - VModInfo * /* info */, - XkbDescPtr /* xkb */ -); +extern void InitVModInfo(VModInfo * /* info */ , + XkbDescPtr /* xkb */ + ); -extern void ClearVModInfo( - VModInfo * /* info */, - XkbDescPtr /* xkb */ -); +extern void ClearVModInfo(VModInfo * /* info */ , + XkbDescPtr /* xkb */ + ); -extern Bool HandleVModDef( - VModDef * /* stmt */, - unsigned /* mergeMode */, - VModInfo * /* info */ -); +extern Bool HandleVModDef(VModDef * /* stmt */ , + unsigned /* mergeMode */ , + VModInfo * /* info */ + ); -extern Bool ApplyVModDefs( - VModInfo * /* info */, - XkbDescPtr /* xkb */ -); +extern Bool ApplyVModDefs(VModInfo * /* info */ , + XkbDescPtr /* xkb */ + ); -extern int LookupVModIndex( - XPointer /* priv */, - Atom /* elem */, - Atom /* field */, - unsigned /* type */, - ExprResult * /* val_rtrn */ -); +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 LookupVModMask(XPointer /* priv */ , + Atom /* elem */ , + Atom /* field */ , + unsigned /* type */ , + ExprResult * /* val_rtrn */ + ); -extern int FindKeypadVMod( - XkbDescPtr /* xkb */ -); +extern int FindKeypadVMod(XkbDescPtr /* xkb */ + ); -extern Bool ResolveVirtualModifier( - ExprDef * /* def */, - ExprResult * /* value_rtrn */, - VModInfo * /* info */ -); +extern Bool ResolveVirtualModifier(ExprDef * /* def */ , + ExprResult * /* value_rtrn */ , + VModInfo * /* info */ + ); #endif /* VMOD_H */ diff --git a/app/xkbcomp/xkbcomp.c b/app/xkbcomp/xkbcomp.c index 111a7b371..b0df9207e 100644 --- a/app/xkbcomp/xkbcomp.c +++ b/app/xkbcomp/xkbcomp.c @@ -1,4 +1,3 @@ -/* $Xorg: xkbcomp.c,v 1.4 2000/08/17 19:54:33 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,7 +23,6 @@ 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> @@ -40,7 +38,6 @@ #include <malloc.h> #endif -#define DEBUG_VAR_NOT_LOCAL #define DEBUG_VAR debugFlags #include "xkbcomp.h" #include <stdlib.h> @@ -76,35 +73,37 @@ #define INPUT_XKB 1 #define INPUT_XKM 2 +unsigned int debugFlags; + static const char *fileTypeExt[] = { - "XXX", - "xkm", - "h", - "xkb", - "dir" + "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; +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; /***====================================================================***/ @@ -112,16 +111,18 @@ static unsigned int device_id = XkbUseCoreKbd; #define M1(m,a) fprintf(stderr,(m),(a)) static void -Usage(int argc,char *argv[]) +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]); + 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"); + 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"); @@ -129,44 +130,49 @@ Usage(int argc,char *argv[]) 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"); + 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("-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"); + 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"); + 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"); + if (!xkblist) + { + M("-xkb Create an XKB source (.xkb) file\n"); + M("-xkm Create a compiled key map (.xkm) file\n"); } return; } @@ -176,529 +182,701 @@ Usage(int argc,char *argv[]) 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; - } + 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[]) +parseArgs(int argc, char *argv[]) { -register int i,tmp; + register int i, tmp; - i= strlen(argv[0]); - tmp= strlen("xkblist"); - if ((i>=tmp)&&(strcmp(&argv[0][i-tmp],"xkblist")==0)) { - xkblist= True; + 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; - } + 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); - } + 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) { + 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; - } + 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; + inputFormat = INPUT_XKB; + else if (inputFile == NULL) + { + ERROR("No input file specified\n"); + return False; } - else if (uStringEqual(inputFile,"-")) { - inputFormat= INPUT_XKB; + else if (uStringEqual(inputFile, "-")) + { + inputFormat = INPUT_XKB; } #ifndef WIN32 - else if (strchr(inputFile,':')==0) { + else if (strchr(inputFile, ':') == NULL) + { #else - else if ((strchr(inputFile,':')==0) || ( - strlen(inputFile) > 2 && - isalpha(inputFile[0]) && - inputFile[1] == ':' && strchr(inputFile + 2,':')==NULL)) { + else if ((strchr(inputFile, ':') == NULL) || (strlen(inputFile) > 2 && + isalpha(inputFile[0]) && + inputFile[1] == ':' + && strchr(inputFile + 2, + ':') == NULL)) + { #endif - int len; - len= strlen(inputFile); - if (inputFile[len-1]==')') { - char *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; - } - } + int len; + len = strlen(inputFile); + if (inputFile[len - 1] == ')') + { + char *tmp; + if ((tmp = strchr(inputFile, '(')) != NULL) + { + *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; + 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_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 ((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; - } + 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) && (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) && (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]); + else if (outputFile == NULL) + { + int len; + char *ch, *name, buf[128]; + if (inDpyName[0] == ':') + snprintf(name = buf, sizeof(buf), "server%s", inDpyName); + else + name = inDpyName; + + len = strlen(name) + strlen(fileTypeExt[outputFormat]) + 2; + outputFile = uTypedCalloc(len, char); + if (outputFile == NULL) + { + WSGO("Cannot allocate space for output file name\n"); + ACTION("Exiting\n"); + exit(1); + } + strcpy(outputFile, name); + for (ch = outputFile; (*ch) != '\0'; ch++) + { + if (*ch == ':') + *ch = '-'; + else if (*ch == '.') + *ch = '_'; + } + *ch++ = '.'; + strcpy(ch, fileTypeExt[outputFormat]); } #ifdef WIN32 - else if (strlen(outputFile) > 2 && - isalpha(outputFile[0]) && - outputFile[1] == ':' && strchr(outputFile + 2,':')==NULL) { + 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; + else if (strchr(outputFile, ':') != NULL) + { + outDpyName = outputFile; + outputFile = NULL; + outputFormat = WANT_X_SERVER; } return True; } static Display * -GetDisplay(char *program,char *dpyName) +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); - } + 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); + XSynchronize(dpy, True); return dpy; } /***====================================================================***/ +#ifdef DEBUG extern int yydebug; +#endif int -main(int argc,char *argv[]) +main(int argc, char *argv[]) { -FILE * file; -XkbFile * rtrn; -XkbFile * mapToUse; -int ok; -XkbFileInfo result; -Status status; + FILE *file; /* input file (or stdin) */ + XkbFile *rtrn; + XkbFile *mapToUse; + int ok; + XkbFileInfo result; + Status status; yyin = stdin; uSetEntryFile(NullString); @@ -706,281 +884,339 @@ Status status; uSetErrorFile(NullString); XkbInitIncludePath(); - if (!parseArgs(argc,argv)) - exit(1); + if (!parseArgs(argc, argv)) + exit(1); #ifdef DEBUG - if (debugFlags&0x2) - yydebug= 1; + if (debugFlags & 0x2) + yydebug = 1; #endif if (preErrorMsg) - uSetPreErrorMessage(preErrorMsg); + uSetPreErrorMessage(preErrorMsg); if (errorPrefix) - uSetErrorPrefix(errorPrefix); + uSetErrorPrefix(errorPrefix); if (postErrorMsg) - uSetPostErrorMessage(postErrorMsg); - file= NULL; + uSetPostErrorMessage(postErrorMsg); + file = NULL; XkbInitAtoms(NULL); XkbAddDefaultDirectoriesToPath(); - if (xkblist) { - Bool gotSome; - gotSome= GenerateListing(outputFile); - if ((warningLevel>7)&&(!gotSome)) - return -1; - return 0; + 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"); - } + 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); - } + 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 (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 ((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; - } + if (file) + { + ok = True; + setScanState(inputFile, 1); + if ((inputFormat == INPUT_XKB) /* parse .xkb file */ + && (XKBParseFile(file, &rtrn) && (rtrn != NULL))) + { + fclose(file); + mapToUse = rtrn; + if (inputMap != NULL) /* map specified on cmdline? */ + { + while ((mapToUse) + && (!uStringEqual(mapToUse->name, inputMap))) + { + mapToUse = (XkbFile *) mapToUse->common.next; + } + if (!mapToUse) + { + FATAL2("No map named \"%s\" in \"%s\"\n", + inputMap, inputFile); + /* NOTREACHED */ + } + } + else if (rtrn->common.next != NULL) + { + /* look for map with XkbLC_Default flag. */ + mapToUse = rtrn; + for (; mapToUse; mapToUse = (XkbFile *) mapToUse->common.next) + { + if (mapToUse->flags & XkbLC_Default) + break; + } + if (!mapToUse) + { + mapToUse = rtrn; + if (warningLevel > 4) + { + WARN1 + ("No map specified, but \"%s\" has several\n", + inputFile); + ACTION1 + ("Using the first defined map, \"%s\"\n", + mapToUse->name); + } + } + } + bzero((char *) &result, sizeof(result)); + result.type = mapToUse->type; + if ((result.xkb = XkbAllocKeyboard()) == NULL) + { + WSGO("Cannot allocate keyboard description\n"); + /* NOTREACHED */ + } + switch (mapToUse->type) + { + case XkmSemanticsFile: + case XkmLayoutFile: + case XkmKeymapFile: + ok = CompileKeymap(mapToUse, &result, MergeReplace); + break; + case XkmKeyNamesIndex: + ok = CompileKeycodes(mapToUse, &result, MergeReplace); + break; + case XkmTypesIndex: + ok = CompileKeyTypes(mapToUse, &result, MergeReplace); + break; + case XkmSymbolsIndex: + /* if it's just symbols, invent key names */ + result.xkb->flags |= AutoKeyNames; + ok = False; + break; + case XkmCompatMapIndex: + ok = CompileCompatMap(mapToUse, &result, MergeReplace, NULL); + break; + case XkmGeometryFile: + case XkmGeometryIndex: + /* if it's just a geometry, invent key names */ + result.xkb->flags |= AutoKeyNames; + ok = CompileGeometry(mapToUse, &result, MergeReplace); + break; + default: + WSGO1("Unknown file type %d\n", mapToUse->type); + ok = False; + break; + } + } + else if (inputFormat == INPUT_XKM) /* parse xkm file */ + { + unsigned tmp; + bzero((char *) &result, sizeof(result)); + if ((result.xkb = XkbAllocKeyboard()) == NULL) + { + WSGO("Cannot allocate keyboard description\n"); + /* NOTREACHED */ + } + tmp = XkmReadFile(file, 0, XkmKeymapLegal, &result); + if (tmp == XkmKeymapLegal) + { + ERROR1("Cannot read XKM file \"%s\"\n", inputFile); + ok = False; + } + } + 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 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; + 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); + 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; - } + 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); - } + 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); + out = fdopen(outputFileFd, openMode); #else - close(outputFileFd); - out= fopen(outputFile, "wb"); + 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); - } - } + /* end BR */ + if (out == NULL) + { + ERROR1 + ("Cannot open \"%s\" to write keyboard description\n", + outputFile); + ACTION("Exiting\n"); + exit(1); + } + } + } + switch (outputFormat) + { + case WANT_XKM_FILE: + ok = XkbWriteXKMFile(out, &result); + break; + case WANT_XKB_FILE: + ok = XkbWriteXKBFile(out, &result, showImplicit, NULL, NULL); + break; + case WANT_C_HDR: + ok = XkbWriteCFile(out, outputFile, &result); + break; + case WANT_X_SERVER: + if (!(ok = XkbWriteToServer(&result))) + { + ERROR2("%s in %s\n", _XkbErrMessages[_XkbErrCode], + _XkbErrLocation ? _XkbErrLocation : "unknown"); + ACTION1("Couldn't write keyboard description to %s\n", + outDpyName); + } + break; + default: + WSGO1("Unknown output format %d\n", outputFormat); + ACTION("No output file created\n"); + ok = False; + break; + } + if (outputFormat != WANT_X_SERVER) + { + if (fclose(out)) + { + ERROR1("Cannot close \"%s\" properly (not enough space?)\n", + outputFile); + ok= False; + } + else if (!ok) + { + ERROR2("%s in %s\n", _XkbErrMessages[_XkbErrCode], + _XkbErrLocation ? _XkbErrLocation : "unknown"); + } + if (!ok) + { + ACTION1("Output file \"%s\" removed\n", outputFile); + unlink(outputFile); + } + } } - if (inDpy) - XCloseDisplay(inDpy); - inDpy= NULL; + if (inDpy) + XCloseDisplay(inDpy); + inDpy = NULL; if (outDpy) - XCloseDisplay(outDpy); + XCloseDisplay(outDpy); uFinishUp(); - return (ok==0); + return (ok == 0); } diff --git a/app/xkbcomp/xkbcomp.h b/app/xkbcomp/xkbcomp.h index b9b9caed1..d6a718541 100644 --- a/app/xkbcomp/xkbcomp.h +++ b/app/xkbcomp/xkbcomp.h @@ -1,4 +1,3 @@ -/* $Xorg: xkbcomp.h,v 1.3 2000/08/17 19:54:33 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,13 +23,11 @@ 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 @@ -78,9 +75,10 @@ extern char *scanFile; #define FileSymInterp 100 -typedef struct _ParseCommon { - unsigned stmtType; - struct _ParseCommon *next; +typedef struct _ParseCommon +{ + unsigned stmtType; + struct _ParseCommon *next; } ParseCommon; #define ExprValue 0 @@ -111,188 +109,215 @@ typedef struct _ParseCommon { #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; +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; +typedef struct _Expr +{ + ParseCommon common; + unsigned op; + unsigned type; + union + { + struct + { + struct _Expr *left; + struct _Expr *right; + } binary; + struct + { + Atom element; + Atom field; + } field; + struct + { + Atom element; + Atom field; + struct _Expr *entry; + } array; + struct + { + Atom name; + struct _Expr *args; + } action; + struct + { + int nSyms; + int szSyms; + char **syms; + } list; + struct + { + int x; + int y; + } coord; + struct _Expr *child; + Atom str; + unsigned uval; + int ival; + char keyName[5]; + Opaque ptr; } value; } ExprDef; -typedef struct _VarDef { - ParseCommon common; - unsigned merge; - ExprDef *name; - ExprDef *value; +typedef struct _VarDef +{ + ParseCommon common; + unsigned merge; + ExprDef *name; + ExprDef *value; } VarDef; -typedef struct _VModDef { - ParseCommon common; - unsigned merge; - Atom name; - ExprDef *value; +typedef struct _VModDef +{ + ParseCommon common; + unsigned merge; + Atom name; + ExprDef *value; } VModDef; -typedef struct _KeycodeDef { - ParseCommon common; - unsigned merge; - char name[5]; - ExprDef *value; +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]; +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; +typedef struct _KeyTypeDef +{ + ParseCommon common; + unsigned merge; + Atom name; + VarDef *body; } KeyTypeDef; -typedef struct _SymbolsDef { - ParseCommon common; - unsigned merge; - char keyName[5]; - ExprDef * symbols; +typedef struct _SymbolsDef +{ + ParseCommon common; + unsigned merge; + char keyName[5]; + ExprDef *symbols; } SymbolsDef; -typedef struct _ModMapDef { - ParseCommon common; - unsigned merge; - Atom modifier; - ExprDef * keys; +typedef struct _ModMapDef +{ + ParseCommon common; + unsigned merge; + Atom modifier; + ExprDef *keys; } ModMapDef; -typedef struct _GroupCompatDef { - ParseCommon common; - unsigned merge; - int group; - ExprDef * def; +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; +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; +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; +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; +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; +typedef struct _KeyDef +{ + ParseCommon common; + unsigned defined; + char *name; + ExprDef *expr; } KeyDef; -typedef struct _RowDef { - ParseCommon common; - int nKeys; - KeyDef * keys; +typedef struct _RowDef +{ + ParseCommon common; + int nKeys; + KeyDef *keys; } RowDef; -typedef struct _SectionDef { - ParseCommon common; - unsigned merge; - Atom name; - int nRows; - RowDef * rows; +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]; +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; +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; +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 @@ -300,55 +325,50 @@ typedef struct _DoodadDef { 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; +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 */ -); +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 CompileCompatMap(XkbFile * /* file */ , + XkbFileInfo * /* result */ , + unsigned /* merge */ , + LEDInfoPtr * /* unboundLEDs */ + ); -extern Bool CompileSymbols( - XkbFile * /* file */, - XkbFileInfo * /* result */, - unsigned /* merge */ -); +extern Bool CompileSymbols(XkbFile * /* file */ , + XkbFileInfo * /* result */ , + unsigned /* merge */ + ); #define WantLongListing (1<<0) #define WantPartialMaps (1<<1) @@ -356,25 +376,21 @@ extern Bool CompileSymbols( #define WantFullNames (1<<3) #define ListRecursive (1<<4) -extern char * rootDir; +extern char *rootDir; extern unsigned verboseLevel; -extern unsigned dirsToStrip; +extern unsigned dirsToStrip; -extern Bool AddListing( - char * /* file */, - char * /* map */ -); +extern Bool AddListing(char * /* file */ , + char * /* map */ + ); -extern Bool AddMatchingFiles( - char * /* head_in */ -); +extern Bool AddMatchingFiles(char * /* head_in */ + ); -extern int AddMapOnly( - char * /* map */ -); +extern int AddMapOnly(char * /* map */ + ); -extern int GenerateListing( - char * /* filename */ -); +extern int GenerateListing(char * /* filename */ + ); #endif /* XKBCOMP_H */ diff --git a/app/xkbcomp/xkbcomp.man b/app/xkbcomp/xkbcomp.man index aa18d3e72..0e4d29454 100644 --- a/app/xkbcomp/xkbcomp.man +++ b/app/xkbcomp/xkbcomp.man @@ -1,9 +1,3 @@ -.\" $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 @@ -63,6 +57,9 @@ To prevent the current and default directories from being searched, use the \-I option alone (i.e. without a directory), before any \-I options that specify the directories you do want searched. .TP 8 +.B \-i\ \fIdeviceid\fP +Specifies device ID (not name) to compile for. +.TP 8 .B \-l List maps that specify the \fImap\fP pattern in any files listed on the command line (not implemented yet). diff --git a/app/xkbcomp/xkbparse.y b/app/xkbcomp/xkbparse.y index 52afa2b80..d73b92a27 100644 --- a/app/xkbcomp/xkbparse.y +++ b/app/xkbcomp/xkbparse.y @@ -1,4 +1,3 @@ -/* $Xorg: xkbparse.y,v 1.3 2000/08/17 19:54:34 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,7 +23,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. ********************************************************/ -/* $XFree86: xc/programs/xkbcomp/xkbparse.y,v 3.11tsi Exp $ */ %token END_OF_FILE 0 @@ -100,6 +98,7 @@ #include <X11/extensions/XKBgeom.h> #include <stdlib.h> +unsigned int parseDebug; %} %right EQUALS @@ -137,9 +136,9 @@ XkbFile *file; } %type <ival> Number Integer Float SignedNumber -%type <uval> XkbCompositeType FileType MergeMode OptMergeMode KeySym +%type <uval> XkbCompositeType FileType MergeMode OptMergeMode %type <uval> DoodadType Flag Flags OptFlags -%type <str> KeyName MapName OptMapName +%type <str> KeyName MapName OptMapName KeySym %type <sval> FieldSpec Ident Element String %type <any> DeclList Decl %type <expr> OptExprList ExprList Expr Term Lhs Terminal ArrayInit @@ -312,10 +311,10 @@ Decl : OptMergeMode VarDecl { if ($1==MergeAltForm) { yyerror("cannot use 'alternate' to include other maps"); - $$= &IncludeCreate(scanStr,MergeDefault)->common; + $$= &IncludeCreate(scanBuf,MergeDefault)->common; } else { - $$= &IncludeCreate(scanStr,$1)->common; + $$= &IncludeCreate(scanBuf,$1)->common; } } ; @@ -375,9 +374,9 @@ InterpretDecl : INTERPRET InterpretMatch OBRACE ; InterpretMatch : KeySym PLUS Expr - { $$= InterpCreate((KeySym)$1,$3); } + { $$= InterpCreate(XStringToKeysym($1), $3); } | KeySym - { $$= InterpCreate((KeySym)$1,NULL); } + { $$= InterpCreate(XStringToKeysym($1), NULL); } ; VarDeclList : VarDeclList VarDecl @@ -717,33 +716,17 @@ OptKeySymList : KeySymList { $$= $1; } ; KeySymList : KeySymList COMMA KeySym - { $$= AppendKeysymList($1,(KeySym)$3); } + { $$= AppendKeysymList($1,$3); } | KeySym - { $$= CreateKeysymList((KeySym)$1); } + { $$= CreateKeysymList($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; - } +KeySym : IDENT { $$= strdup(scanBuf); } + | SECTION { $$= strdup("section"); } | Integer { - if ($1<10) $$= $1+'0'; /* XK_0 .. XK_9 */ - else $$= $1; + if ($1<10) { $$= malloc(2); $$[0]= '0' + $1; $$[1]= '\0'; } + else { $$= malloc(19); snprintf($$, 19, "0x%x", $1); } } ; @@ -761,21 +744,21 @@ Float : FLOAT { $$= scanInt; } Integer : INTEGER { $$= scanInt; } ; -KeyName : KEYNAME { $$= scanStr; scanStr= NULL; } +KeyName : KEYNAME { $$= strdup(scanBuf); } ; -Ident : IDENT { $$= XkbInternAtom(NULL,scanStr,False); } +Ident : IDENT { $$= XkbInternAtom(NULL,scanBuf,False); } | DEFAULT { $$= XkbInternAtom(NULL,"default",False); } ; -String : STRING { $$= XkbInternAtom(NULL,scanStr,False); } +String : STRING { $$= XkbInternAtom(NULL,scanBuf,False); } ; OptMapName : MapName { $$= $1; } | { $$= NULL; } ; -MapName : STRING { $$= scanStr; scanStr= NULL; } +MapName : STRING { $$= strdup(scanBuf); } ; %% void @@ -784,8 +767,8 @@ 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); + if ((warningLevel>3)) + (void)fprintf(stderr,"last scanned symbol is: %s\n",scanBuf); } return; } diff --git a/app/xkbcomp/xkbpath.c b/app/xkbcomp/xkbpath.c index 0a7329c8e..68020129e 100644 --- a/app/xkbcomp/xkbpath.c +++ b/app/xkbcomp/xkbpath.c @@ -1,4 +1,3 @@ -/* $Xorg: xkbpath.c,v 1.3 2000/08/17 19:54:34 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,12 +23,10 @@ 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> @@ -44,87 +41,130 @@ #define PATH_MAX 1024 #endif -#define PATH_CHUNK 8 +#define PATH_CHUNK 8 /* initial szPath */ -static Bool noDefaultPath = False; -static int longestPath; -static int szPath; -static int nPathEntries; -static char ** includePath; +static Bool noDefaultPath = False; +static int szPath; /* number of entries allocated for includePath */ +static int nPathEntries; /* number of actual entries in includePath */ +static char **includePath; /* Holds all directories we might be including data from */ +/** + * Extract the first token from an include statement. + * @param str_inout Input statement, modified in-place. Can be passed in + * repeatedly. If str_inout is NULL, the parsing has completed. + * @param file_rtrn Set to the include file to be used. + * @param map_rtrn Set to whatever comes after ), if any. + * @param nextop_rtrn Set to the next operation in the complete statement. + * @param extra_data Set to the string between ( and ), if any. + * + * @return True if parsing was succcessful, False for an illegal string. + * + * Example: "evdev+aliases(qwerty)" + * str_inout = aliases(qwerty) + * nextop_retrn = + + * extra_data = NULL + * file_rtrn = evdev + * map_rtrn = NULL + * + * 2nd run with "aliases(qwerty)" + * str_inout = NULL + * file_rtrn = aliases + * map_rtrn = qwerty + * extra_data = NULL + * nextop_retrn = "" + * + */ Bool -XkbParseIncludeMap(char **str_inout,char **file_rtrn,char **map_rtrn, - char *nextop_rtrn, char **extra_data) +XkbParseIncludeMap(char **str_inout, char **file_rtrn, char **map_rtrn, + char *nextop_rtrn, char **extra_data) { -char *tmp,*str,*next; + char *tmp, *str, *next; - str= *str_inout; - if ((*str=='+')||(*str=='|')) { - *file_rtrn= *map_rtrn= NULL; - *nextop_rtrn= *str; - next= str+1; + 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 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); - } + else + { + /* search for tokens inside the string */ + next = strpbrk(str, "|+"); + if (next) + { + /* set nextop_rtrn to \0, next to next character */ + *nextop_rtrn = *next; + *next++ = '\0'; + } + else + { + *nextop_rtrn = '\0'; + next = NULL; + } + /* search for :, store result in extra_data */ + tmp = strchr(str, ':'); + if (tmp != NULL) + { + *tmp++ = '\0'; + *extra_data = uStringDup(tmp); + } + else + { + *extra_data = NULL; + } + tmp = strchr(str, '('); + if (tmp == NULL) + { + *file_rtrn = uStringDup(str); + *map_rtrn = NULL; + } + else if (str[0] == '(') + { + uFree(*extra_data); + return False; + } + else + { + *tmp++ = '\0'; + *file_rtrn = uStringDup(str); + str = tmp; + tmp = strchr(str, ')'); + if ((tmp == NULL) || (tmp[1] != '\0')) + { + uFree(*file_rtrn); + uFree(*extra_data); + return False; + } + *tmp++ = '\0'; + *map_rtrn = uStringDup(str); + } } - if (*nextop_rtrn=='\0') - *str_inout= NULL; - else if ((*nextop_rtrn=='|')||(*nextop_rtrn=='+')) - *str_inout= next; - else return False; + if (*nextop_rtrn == '\0') + *str_inout = NULL; + else if ((*nextop_rtrn == '|') || (*nextop_rtrn == '+')) + *str_inout = next; + else + return False; return True; } +/** + * Init memory for include paths. + */ Bool XkbInitIncludePath(void) { - szPath= PATH_CHUNK; - includePath= (char **)calloc(szPath,sizeof(char *)); - if (includePath==NULL) - return False; + szPath = PATH_CHUNK; + includePath = (char **) calloc(szPath, sizeof(char *)); + if (includePath == NULL) + return False; return True; } @@ -132,191 +172,249 @@ void XkbAddDefaultDirectoriesToPath(void) { if (noDefaultPath) - return; + return; XkbAddDirectoryToPath(DFLT_XKB_CONFIG_ROOT); } +/** + * Remove all entries from the global includePath. + */ void XkbClearIncludePath(void) { -register int i; + 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; + if (szPath > 0) + { + for (i = 0; i < nPathEntries; i++) + { + if (includePath[i] != NULL) + { + uFree(includePath[i]); + includePath[i] = NULL; + } + } + nPathEntries = 0; } noDefaultPath = True; return; } +/** + * Add the given path to the global includePath variable. + * If dir is NULL, the includePath is emptied. + */ Bool XkbAddDirectoryToPath(const char *dir) { -int len; - if ((dir==NULL)||(dir[0]=='\0')) { - XkbClearIncludePath(); - return True; + int len; + if ((dir == NULL) || (dir[0] == '\0')) + { + XkbClearIncludePath(); + return True; } #ifdef __UNIXOS2__ - dir = (char*)__XOS2RedirRoot(dir); + 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; + 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; - } + 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; + 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); + strcpy(includePath[nPathEntries++], dir); return True; } /***====================================================================***/ +/** + * Return the xkb directory based on the type. + * Do not free the memory returned by this function. + */ char * XkbDirectoryForInclude(unsigned type) { -static char buf[32]; + 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; + 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; +typedef struct _FileCacheEntry +{ + char *name; + unsigned type; + char *path; + void *data; + struct _FileCacheEntry *next; } FileCacheEntry; -static FileCacheEntry *fileCache; +static FileCacheEntry *fileCache; +/** + * Add the file with the given name to the internal cache to avoid opening and + * parsing the file multiple times. If a cache entry for the same name + type + * is already present, the entry is overwritten and the data belonging to the + * previous entry is returned. + * + * @parameter name The name of the file (e.g. evdev). + * @parameter type Type of the file (XkbTypesIdx, ... or XkbSemanticsFile, ...) + * @parameter path The full path to the file. + * @parameter data Already parsed data. + * + * @return The data from the overwritten file or NULL. + */ void * -XkbAddFileToCache(char *name,unsigned type,char *path,void *data) +XkbAddFileToCache(char *name, unsigned type, char *path, void *data) { -FileCacheEntry *entry; + 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; - } + 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; + entry = uTypedAlloc(FileCacheEntry); + if (entry != NULL) + { + entry->name = name; + entry->type = type; + entry->path = path; + entry->data = data; + entry->next = fileCache; + fileCache = entry; } return NULL; } +/** + * Search for the given name + type in the cache. + * + * @parameter name The name of the file (e.g. evdev). + * @parameter type Type of the file (XkbTypesIdx, ... or XkbSemanticsFile, ...) + * @parameter pathRtrn Set to the full path of the given entry. + * + * @return the data from the cache entry or NULL if no matching entry was found. + */ void * -XkbFindFileInCache(char *name,unsigned type,char **pathRtrn) +XkbFindFileInCache(char *name, unsigned type, char **pathRtrn) { -FileCacheEntry *entry; + FileCacheEntry *entry; - for (entry=fileCache;entry!=NULL;entry=entry->next) { - if ((type==entry->type)&&(uStringEqual(name,entry->name))) { - *pathRtrn= entry->path; - return entry->data; - } + for (entry = fileCache; entry != NULL; entry = entry->next) + { + if ((type == entry->type) && (uStringEqual(name, entry->name))) + { + *pathRtrn = entry->path; + return entry->data; + } } return NULL; } /***====================================================================***/ +/** + * Search for the given file name in the include directories. + * + * @param type one of XkbTypesIndex, XkbCompatMapIndex, ..., or + * XkbSemanticsFile, XkmKeymapFile, ... + * @param pathReturn is set to the full path of the file if found. + * + * @return an FD to the file or NULL. If NULL is returned, the value of + * pathRtrn is undefined. + */ FILE * -XkbFindFileInPath(char *name,unsigned type,char **pathRtrn) +XkbFindFileInPath(char *name, unsigned type, char **pathRtrn) { -register int i; -FILE *file= NULL; -int nameLen,typeLen,pathLen; -char buf[PATH_MAX],*typeDir; + 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; + 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 ((nameLen + typeLen + pathLen + 2) >= PATH_MAX) + { + ERROR3("File name (%s/%s/%s) too long\n", includePath[i], + typeDir, name); + ACTION("Ignored\n"); + continue; + } + snprintf(buf, sizeof(buf), "%s/%s/%s", includePath[i], typeDir, name); + file = fopen(buf, "r"); + if (file != NULL) + break; } - if ((file!=NULL)&&(pathRtrn!=NULL)) { - *pathRtrn= (char *)calloc(strlen(buf)+1,sizeof(char)); - if (*pathRtrn!=NULL) - strcpy(*pathRtrn,buf); + if ((file != NULL) && (pathRtrn != NULL)) + { + *pathRtrn = (char *) calloc(strlen(buf) + 1, sizeof(char)); + if (*pathRtrn != NULL) + strcpy(*pathRtrn, buf); } return file; } - diff --git a/app/xkbcomp/xkbpath.h b/app/xkbcomp/xkbpath.h index 75c137d0c..66c3ab76b 100644 --- a/app/xkbcomp/xkbpath.h +++ b/app/xkbcomp/xkbpath.h @@ -1,4 +1,3 @@ -/* $XConsortium $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,56 +23,43 @@ 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 Bool XkbInitIncludePath(void); -extern void XkbClearIncludePath( - void -); +extern void XkbClearIncludePath(void); -extern void XkbAddDefaultDirectoriesToPath( - void -); +extern void XkbAddDefaultDirectoriesToPath(void); -extern Bool XkbAddDirectoryToPath( - const char * /* dir */ -); +extern Bool XkbAddDirectoryToPath(const char * /* dir */ + ); -extern char * XkbDirectoryForInclude( - unsigned /* type */ -); +extern char *XkbDirectoryForInclude(unsigned /* type */ + ); -extern FILE *XkbFindFileInPath( - char * /* name */, - unsigned /* type */, - char ** /* pathRtrn */ -); +extern FILE *XkbFindFileInPath(char * /* name */ , + unsigned /* type */ , + char ** /* pathRtrn */ + ); -extern void * XkbAddFileToCache( - char * /* name */, - unsigned /* type */, - char * /* path */, - void * /* data */ -); +extern void *XkbAddFileToCache(char * /* name */ , + unsigned /* type */ , + char * /* path */ , + void * /* data */ + ); -extern void * XkbFindFileInCache( - char * /* name */, - unsigned /* type */, - char ** /* pathRtrn */ -); +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 */ -); +extern Bool XkbParseIncludeMap(char ** /* str_inout */ , + char ** /* file_rtrn */ , + char ** /* map_rtrn */ , + char * /* nextop_rtrn */ , + char ** /* extra_data */ + ); #endif /* _XKBPATH_H_ */ diff --git a/app/xkbcomp/xkbscan.c b/app/xkbcomp/xkbscan.c index ef2227d79..03193e2d0 100644 --- a/app/xkbcomp/xkbscan.c +++ b/app/xkbcomp/xkbscan.c @@ -1,4 +1,3 @@ -/* $Xorg: xkbscan.c,v 1.3 2000/08/17 19:54:34 cpqbld Exp $ */ /************************************************************ Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. @@ -24,7 +23,6 @@ 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> @@ -37,183 +35,355 @@ #include "utils.h" #include "parseutils.h" -FILE *yyin = NULL; +unsigned int scanDebug; -static char scanFileBuf[1024]; -char * scanFile= scanFileBuf; -int lineNum= 0; +FILE *yyin = NULL; -int scanInt; -char *scanIntStr; -int scanIntClass; +static char scanFileBuf[1024] = {0}; +char *scanFile = scanFileBuf; +int lineNum = 0; -char *scanStr = NULL; -int scanStrLine= 0; +int scanInt; -#define BUFSIZE 512 -static int nInBuf = 0; -static char buf[BUFSIZE]; +char scanBuf[1024]; +static int scanStrLine = 0; -#ifdef DEBUG +#define BUFSIZE 4096 +static char readBuf[BUFSIZE]; +static int readBufPos = 0; +static int readBufLen = 0; -extern unsigned debugFlags; +#ifdef DEBUG +extern int 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; + static char buf[32]; + + switch (tok) + { + case END_OF_FILE: + snprintf(buf, sizeof(buf), "END_OF_FILE"); + break; + case ERROR_TOK: + snprintf(buf, sizeof(buf), "ERROR"); + break; + + case XKB_KEYMAP: + snprintf(buf, sizeof(buf), "XKB_KEYMAP"); + break; + case XKB_KEYCODES: + snprintf(buf, sizeof(buf), "XKB_KEYCODES"); + break; + case XKB_TYPES: + snprintf(buf, sizeof(buf), "XKB_TYPES"); + break; + case XKB_SYMBOLS: + snprintf(buf, sizeof(buf), "XKB_SYMBOLS"); + break; + case XKB_COMPATMAP: + snprintf(buf, sizeof(buf), "XKB_COMPATMAP"); + break; + case XKB_GEOMETRY: + snprintf(buf, sizeof(buf), "XKB_GEOMETRY"); + break; + case XKB_SEMANTICS: + snprintf(buf, sizeof(buf), "XKB_SEMANTICS"); + break; + case XKB_LAYOUT: + snprintf(buf, sizeof(buf), "XKB_LAYOUT"); + break; + + case INCLUDE: + snprintf(buf, sizeof(buf), "INCLUDE"); + break; + case OVERRIDE: + snprintf(buf, sizeof(buf), "OVERRIDE"); + break; + case AUGMENT: + snprintf(buf, sizeof(buf), "AUGMENT"); + break; + case REPLACE: + snprintf(buf, sizeof(buf), "REPLACE"); + break; + case ALTERNATE: + snprintf(buf, sizeof(buf), "ALTERNATE"); + break; + + case VIRTUAL_MODS: + snprintf(buf, sizeof(buf), "VIRTUAL_MODS"); + break; + case TYPE: + snprintf(buf, sizeof(buf), "TYPE"); + break; + case INTERPRET: + snprintf(buf, sizeof(buf), "INTERPRET"); + break; + case ACTION_TOK: + snprintf(buf, sizeof(buf), "ACTION"); + break; + case KEY: + snprintf(buf, sizeof(buf), "KEY"); + break; + case ALIAS: + snprintf(buf, sizeof(buf), "ALIAS"); + break; + case GROUP: + snprintf(buf, sizeof(buf), "GROUP"); + break; + case MODIFIER_MAP: + snprintf(buf, sizeof(buf), "MODIFIER_MAP"); + break; + case INDICATOR: + snprintf(buf, sizeof(buf), "INDICATOR"); + break; + case SHAPE: + snprintf(buf, sizeof(buf), "SHAPE"); + break; + case KEYS: + snprintf(buf, sizeof(buf), "KEYS"); + break; + case ROW: + snprintf(buf, sizeof(buf), "ROW"); + break; + case SECTION: + snprintf(buf, sizeof(buf), "SECTION"); + break; + case OVERLAY: + snprintf(buf, sizeof(buf), "OVERLAY"); + break; + case TEXT: + snprintf(buf, sizeof(buf), "TEXT"); + break; + case OUTLINE: + snprintf(buf, sizeof(buf), "OUTLINE"); + break; + case SOLID: + snprintf(buf, sizeof(buf), "SOLID"); + break; + case LOGO: + snprintf(buf, sizeof(buf), "LOGO"); + break; + case VIRTUAL: + snprintf(buf, sizeof(buf), "VIRTUAL"); + break; + + case EQUALS: + snprintf(buf, sizeof(buf), "EQUALS"); + break; + case PLUS: + snprintf(buf, sizeof(buf), "PLUS"); + break; + case MINUS: + snprintf(buf, sizeof(buf), "MINUS"); + break; + case DIVIDE: + snprintf(buf, sizeof(buf), "DIVIDE"); + break; + case TIMES: + snprintf(buf, sizeof(buf), "TIMES"); + break; + case OBRACE: + snprintf(buf, sizeof(buf), "OBRACE"); + break; + case CBRACE: + snprintf(buf, sizeof(buf), "CBRACE"); + break; + case OPAREN: + snprintf(buf, sizeof(buf), "OPAREN"); + break; + case CPAREN: + snprintf(buf, sizeof(buf), "CPAREN"); + break; + case OBRACKET: + snprintf(buf, sizeof(buf), "OBRACKET"); + break; + case CBRACKET: + snprintf(buf, sizeof(buf), "CBRACKET"); + break; + case DOT: + snprintf(buf, sizeof(buf), "DOT"); + break; + case COMMA: + snprintf(buf, sizeof(buf), "COMMA"); + break; + case SEMI: + snprintf(buf, sizeof(buf), "SEMI"); + break; + case EXCLAM: + snprintf(buf, sizeof(buf), "EXCLAM"); + break; + case INVERT: + snprintf(buf, sizeof(buf), "INVERT"); + break; + + case STRING: + snprintf(buf, sizeof(buf), "STRING (%s)", scanBuf); + break; + case INTEGER: + snprintf(buf, sizeof(buf), "INTEGER (0x%x)", scanInt); + break; + case FLOAT: + snprintf(buf, sizeof(buf), "FLOAT (%d.%d)", + scanInt / XkbGeomPtsPerMM, scanInt % XkbGeomPtsPerMM); + break; + case IDENT: + snprintf(buf, sizeof(buf), "IDENT (%s)", scanBuf); + break; + case KEYNAME: + snprintf(buf, sizeof(buf), "KEYNAME (%s)", scanBuf); + break; + + case PARTIAL: + snprintf(buf, sizeof(buf), "PARTIAL"); + break; + case DEFAULT: + snprintf(buf, sizeof(buf), "DEFAULT"); + break; + case HIDDEN: + snprintf(buf, sizeof(buf), "HIDDEN"); + break; + + case ALPHANUMERIC_KEYS: + snprintf(buf, sizeof(buf), "ALPHANUMERIC_KEYS"); + break; + case MODIFIER_KEYS: + snprintf(buf, sizeof(buf), "MODIFIER_KEYS"); + break; + case KEYPAD_KEYS: + snprintf(buf, sizeof(buf), "KEYPAD_KEYS"); + break; + case FUNCTION_KEYS: + snprintf(buf, sizeof(buf), "FUNCTION_KEYS"); + break; + case ALTERNATE_GROUP: + snprintf(buf, sizeof(buf), "ALTERNATE_GROUP"); + break; + + default: + snprintf(buf, sizeof(buf), "UNKNOWN"); + break; } return buf; } #endif +static int +scanchar(void) +{ + if (readBufPos >= readBufLen) { + readBufLen = fread(readBuf, 1, BUFSIZE, yyin); + readBufPos = 0; + if (!readBufLen) + return EOF; + if (feof(yyin)) + readBuf[readBufLen] = EOF; + } + + return readBuf[readBufPos++]; +} + +static void +unscanchar(int c) +{ + if (readBuf[--readBufPos] != c) { + fprintf(stderr, "UNGETCHAR FAILED! Put back %c, was expecting %c at " + "position %d, buf is '%s'\n", c, readBuf[readBufPos], + readBufPos, readBuf); + _exit(94); + } +} + int -setScanState(char *file,int line) +setScanState(char *file, int line) { - if (file!=NULL) - strncpy(scanFile,file,1024); - if (line>=0) - lineNum= 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; + int ch, i; + + i = 0; + while (((ch = scanchar()) != EOF) && (ch != '"')) + { + if (ch == '\\') + { + if ((ch = scanchar()) != EOF) + { + if (ch == 'n') + ch = '\n'; + else if (ch == 't') + ch = '\t'; + else if (ch == 'v') + ch = '\v'; + else if (ch == 'b') + ch = '\b'; + else if (ch == 'r') + ch = '\r'; + else if (ch == 'f') + ch = '\f'; + else if (ch == 'e') + ch = '\033'; + else if (ch == '0') + { + int tmp, stop; + ch = stop = 0; + if (((tmp = scanchar()) != EOF) && (isdigit(tmp)) + && (tmp != '8') && (tmp != '9')) + { + ch = (ch * 8) + (tmp - '0'); + } + else + { + stop = 1; + unscanchar(tmp); + } + if (!stop) + { + if (((tmp = scanchar()) != EOF) + && (isdigit(tmp)) && (tmp != '8') && (tmp != '9')) + { + ch = (ch * 8) + (tmp - '0'); + } + else + { + stop = 1; + unscanchar(tmp); + } + } + if (!stop) + { + if (((tmp = scanchar()) != EOF) + && (isdigit(tmp)) && (tmp != '8') && (tmp != '9')) + { + ch = (ch * 8) + (tmp - '0'); + } + else + { + stop = 1; + unscanchar(tmp); + } + } + } + } + else + return ERROR_TOK; + } + if (i < sizeof(scanBuf) - 1) + scanBuf[i++] = ch; } - if ( ch == '"' ) { - buf[nInBuf++] = '\0'; - if ( scanStr ) - uFree( scanStr ); - scanStr = (char *)uStringDup(buf); - scanStrLine = lineNum; - return STRING; + if (ch == '"') + { + scanBuf[i++] = '\0'; + scanStrLine = lineNum; + return STRING; } return ERROR_TOK; } @@ -221,149 +391,214 @@ int ch; 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; + int ch, i; + + i = 0; + while (((ch = scanchar()) != EOF) && (ch != '>')) + { + if (ch == '\\') + { + if ((ch = scanchar()) != EOF) + { + if (ch == 'n') + ch = '\n'; + else if (ch == 't') + ch = '\t'; + else if (ch == 'v') + ch = '\v'; + else if (ch == 'b') + ch = '\b'; + else if (ch == 'r') + ch = '\r'; + else if (ch == 'f') + ch = '\f'; + else if (ch == 'e') + ch = '\033'; + else if (ch == '0') + { + int tmp, stop; + ch = stop = 0; + if (((tmp = scanchar()) != EOF) && (isdigit(tmp)) + && (tmp != '8') && (tmp != '9')) + { + ch = (ch * 8) + (tmp - '0'); + } + else + { + stop = 1; + unscanchar(tmp); + } + if ((!stop) && ((tmp = scanchar()) != EOF) + && (isdigit(tmp)) && (tmp != '8') && (tmp != '9')) + { + ch = (ch * 8) + (tmp - '0'); + } + else + { + stop = 1; + unscanchar(tmp); + } + if ((!stop) && ((tmp = scanchar()) != EOF) + && (isdigit(tmp)) && (tmp != '8') && (tmp != '9')) + { + ch = (ch * 8) + (tmp - '0'); + } + else + { + stop = 1; + unscanchar(tmp); + } + } + } + else + return ERROR_TOK; + } + + if (i < sizeof(scanBuf) - 1) + scanBuf[i++] = ch; } - if (( ch == '>' )&&(nInBuf<5)) { - buf[nInBuf++] = '\0'; - if ( scanStr ) - uFree( scanStr ); - scanStr = (char *)uStringDup(buf); - scanStrLine = lineNum; - return KEYNAME; + if ((ch == '>') && (i < 5)) + { + scanBuf[i++] = '\0'; + 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 } +static struct _Keyword +{ + const char *keyword; + int token; +} keywords[] = +{ + { + "xkb_keymap", XKB_KEYMAP}, + { + "xkb_keycodes", XKB_KEYCODES}, + { + "xkb_types", XKB_TYPES}, + { + "xkb_symbols", XKB_SYMBOLS}, + { + "xkb_compat", XKB_COMPATMAP}, + { + "xkb_compat_map", XKB_COMPATMAP}, + { + "xkb_compatibility", XKB_COMPATMAP}, + { + "xkb_compatibility_map", XKB_COMPATMAP}, + { + "xkb_geometry", XKB_GEOMETRY}, + { + "xkb_semantics", XKB_SEMANTICS}, + { + "xkb_layout", XKB_LAYOUT}, + { + "include", INCLUDE}, + { + "override", OVERRIDE}, + { + "augment", AUGMENT}, + { + "replace", REPLACE}, + { + "alternate", ALTERNATE}, + { + "partial", PARTIAL}, + { + "default", DEFAULT}, + { + "hidden", HIDDEN}, + { + "virtual_modifiers", VIRTUAL_MODS}, + { + "type", TYPE}, + { + "interpret", INTERPRET}, + { + "action", ACTION_TOK}, + { + "key", KEY}, + { + "alias", ALIAS}, + { + "group", GROUP}, + { + "modmap", MODIFIER_MAP}, + { + "mod_map", MODIFIER_MAP}, + { + "modifier_map", MODIFIER_MAP}, + { + "indicator", INDICATOR}, + { + "shape", SHAPE}, + { + "row", ROW}, + { + "keys", KEYS}, + { + "section", SECTION}, + { + "overlay", OVERLAY}, + { + "text", TEXT}, + { + "outline", OUTLINE}, + { + "solid", SOLID}, + { + "logo", LOGO}, + { + "virtual", VIRTUAL}, + { + "alphanumeric_keys", ALPHANUMERIC_KEYS}, + { + "modifier_keys", MODIFIER_KEYS}, + { + "keypad_keys", KEYPAD_KEYS}, + { + "function_keys", FUNCTION_KEYS}, + { + "alternate_group", ALTERNATE_GROUP} }; -int numKeywords = sizeof(keywords)/sizeof(struct _Keyword); +static 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; + int ch, i, j, found; + int rtrn = IDENT; + + scanBuf[0] = first; + j = 1; + while (((ch = scanchar()) != EOF) && (isalnum(ch) || (ch == '_'))) + { + if (j < sizeof(scanBuf) - 1) + scanBuf[j++] = ch; } - 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; - } + scanBuf[j++] = '\0'; + found = 0; + + for (i = 0; (!found) && (i < numKeywords); i++) + { + if (uStrCaseCmp(scanBuf, keywords[i].keyword) == 0) + { + rtrn = keywords[i].token; + found = 1; + } } - if (!found) { - if ( scanStr ) - uFree( scanStr ); - scanStr = (char *)uStringDup(buf); - scanStrLine = lineNum; - rtrn = IDENT; + if (!found) + { + scanStrLine = lineNum; + rtrn = IDENT; } - if ( (ch!=EOF) && (!isspace(ch)) ) - ungetc( ch, yyin ); - else if ( ch=='\n' ) - lineNum++; + if ((ch != EOF) && (!isspace(ch))) + unscanchar(ch); + else if (ch == '\n') + lineNum++; return rtrn; } @@ -371,98 +606,140 @@ int rtrn = IDENT; 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; + int isFloat = 0; + char buf[1024]; + int nInBuf = 0; + + buf[0] = ch; + nInBuf = 1; + while (((ch = scanchar()) != 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; - } + if (ch == '.') + { + isFloat = 1; + buf[nInBuf++] = ch; + while (((ch = scanchar()) != 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; - } + buf[nInBuf++] = '\0'; + if ((ch != EOF) && (!isspace(ch))) + unscanchar(ch); + + if (isFloat) + { + float tmp; + if (sscanf(buf, "%g", &tmp) == 1) + { + scanInt = tmp * XkbGeomPtsPerMM; + return FLOAT; + } } - else if ( sscanf(buf,"%i",&scanInt)==1 ) - return INTEGER; - fprintf(stderr,"Malformed number %s\n",buf); + 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 { + int ch; + int rtrn; + + do + { + ch = scanchar(); + if (ch == '\n') + { + lineNum++; + } + else if (ch == '#') + { /* handle shell style '#' comments */ + do + { + ch = scanchar(); + } + while ((ch != '\n') && (ch != EOF)); + lineNum++; + } + else if (ch == '/') + { /* handle C++ style double-/ comments */ + int newch = scanchar(); + if (newch == '/') + { + do + { + ch = scanchar(); + } + while ((ch != '\n') && (ch != EOF)); + lineNum++; + } + else if (newch != EOF) + { + unscanchar(newch); + } + } + } + while ((ch != EOF) && (isspace(ch))); + if (ch == '=') + rtrn = EQUALS; + else if (ch == '+') + rtrn = PLUS; + else if (ch == '-') + rtrn = MINUS; + else if (ch == '/') + rtrn = DIVIDE; + else if (ch == '*') + rtrn = TIMES; + else if (ch == '{') + rtrn = OBRACE; + else if (ch == '}') + rtrn = CBRACE; + else if (ch == '(') + rtrn = OPAREN; + else if (ch == ')') + rtrn = CPAREN; + else if (ch == '[') + rtrn = OBRACKET; + else if (ch == ']') + rtrn = CBRACKET; + else if (ch == '.') + rtrn = DOT; + else if (ch == ',') + rtrn = COMMA; + else if (ch == ';') + rtrn = SEMI; + else if (ch == '!') + rtrn = EXCLAM; + else if (ch == '~') + rtrn = INVERT; + else if (ch == '"') + rtrn = yyGetString(); + else if (ch == '<') + rtrn = yyGetKeyName(); + else if (isalpha(ch) || (ch == '_')) + rtrn = yyGetIdent(ch); + else if (isdigit(ch)) + rtrn = yyGetNumber(ch); + else if (ch == EOF) + rtrn = END_OF_FILE; + else + { #ifdef DEBUG - if (debugFlags) - fprintf(stderr,"Unexpected character %c (%d) in input stream\n",ch,ch); + if (debugFlags) + fprintf(stderr, + "Unexpected character %c (%d) in input stream\n", ch, ch); #endif - rtrn = ERROR_TOK; + rtrn = ERROR_TOK; } #ifdef DEBUG - if (debugFlags&0x2) - fprintf(stderr,"scan: %s\n",tokText(rtrn)); + if (debugFlags & 0x2) + fprintf(stderr, "scan: %s\n", tokText(rtrn)); #endif return rtrn; } |