diff options
author | marha <marha@users.sourceforge.net> | 2009-07-25 18:22:39 +0000 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2009-07-25 18:22:39 +0000 |
commit | dc3c299dd0995549e2a6973ca0f25b254afd38a5 (patch) | |
tree | 4e041ba8c2c1348b14e7a28c803d860373747a04 | |
parent | cd50a4bbac9375d3cd460bbdf88395f802609daf (diff) | |
download | vcxsrv-dc3c299dd0995549e2a6973ca0f25b254afd38a5.tar.gz vcxsrv-dc3c299dd0995549e2a6973ca0f25b254afd38a5.tar.bz2 vcxsrv-dc3c299dd0995549e2a6973ca0f25b254afd38a5.zip |
Added xkbcomp-1.1.0.tar.gz
46 files changed, 18236 insertions, 14178 deletions
diff --git a/xkbcomp/ChangeLog b/xkbcomp/ChangeLog index 6bc06a804..af19a1749 100644 --- a/xkbcomp/ChangeLog +++ b/xkbcomp/ChangeLog @@ -1,3 +1,206 @@ +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/xkbcomp/Makefile.am b/xkbcomp/Makefile.am index ffcbcbde3..fca1f6700 100644 --- a/xkbcomp/Makefile.am +++ b/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)"' xkbcomp_LDADD = $(XKBCOMP_LIBS) xkbcomp_SOURCES = \ @@ -105,6 +105,6 @@ MAINTAINERCLEANFILES += ChangeLog .PHONY: ChangeLog ChangeLog: - (GIT_DIR=$(top_srcdir)/.git git-log > .changelog.tmp && mv .changelog.tmp ChangeLog; rm -f .changelog.tmp) || (touch ChangeLog; echo 'git directory not found: installing possibly empty changelog.' >&2) + $(CHANGELOG_CMD) dist-hook: ChangeLog diff --git a/xkbcomp/Makefile.in b/xkbcomp/Makefile.in index daf0a98bd..b34ef7a27 100644 --- a/xkbcomp/Makefile.in +++ b/xkbcomp/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.10.1 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -38,8 +39,9 @@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c @@ -70,8 +72,8 @@ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(appmandir)" -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_xkbcomp_OBJECTS = action.$(OBJEXT) alias.$(OBJEXT) compat.$(OBJEXT) \ expr.$(OBJEXT) geometry.$(OBJEXT) indicators.$(OBJEXT) \ @@ -86,6 +88,7 @@ xkbcomp_DEPENDENCIES = $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) @@ -100,8 +103,22 @@ am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; -am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; -appmanDATA_INSTALL = $(INSTALL_DATA) +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' DATA = $(appman_DATA) ETAGS = etags CTAGS = ctags @@ -109,13 +126,12 @@ DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ - { test ! -d $(distdir) \ - || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr $(distdir); }; } + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print -distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ADMIN_MAN_DIR = @ADMIN_MAN_DIR@ ADMIN_MAN_SUFFIX = @ADMIN_MAN_SUFFIX@ @@ -129,7 +145,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@ @@ -138,9 +157,11 @@ DRIVER_MAN_SUFFIX = @DRIVER_MAN_SUFFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ +EGREP = @EGREP@ EXEEXT = @EXEEXT@ FILE_MAN_DIR = @FILE_MAN_DIR@ FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ +GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -172,6 +193,7 @@ STRIP = @STRIP@ VERSION = @VERSION@ XKBCOMP_CFLAGS = @XKBCOMP_CFLAGS@ XKBCOMP_LIBS = @XKBCOMP_LIBS@ +XKBCONFIGROOT = @XKBCONFIGROOT@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -193,6 +215,7 @@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +distcleancheck_listfiles = @distcleancheck_listfiles@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ @@ -221,9 +244,10 @@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -AM_CFLAGS = $(XKBCOMP_CFLAGS) -DDFLT_XKB_CONFIG_ROOT='"$(datadir)/X11/xkb"' +AM_CFLAGS = $(XKBCOMP_CFLAGS) -DDFLT_XKB_CONFIG_ROOT='"$(XKBCONFIGROOT)"' xkbcomp_LDADD = $(XKBCOMP_LIBS) xkbcomp_SOURCES = \ action.c \ @@ -298,15 +322,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) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -322,9 +346,10 @@ $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENC $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(srcdir) && $(AUTOCONF) + $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then \ @@ -336,7 +361,7 @@ stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_srcdir) && $(AUTOHEADER) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ @@ -345,23 +370,37 @@ distclean-hdr: install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ - else :; fi; \ - done + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) @@ -397,14 +436,14 @@ distclean-compile: .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` @@ -414,34 +453,37 @@ distclean-compile: install-appmanDATA: $(appman_DATA) @$(NORMAL_INSTALL) test -z "$(appmandir)" || $(MKDIR_P) "$(DESTDIR)$(appmandir)" - @list='$(appman_DATA)'; for p in $$list; do \ + @list='$(appman_DATA)'; test -n "$(appmandir)" || list=; \ + for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - f=$(am__strip_dir) \ - echo " $(appmanDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(appmandir)/$$f'"; \ - $(appmanDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(appmandir)/$$f"; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(appmandir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(appmandir)" || exit $$?; \ done uninstall-appmanDATA: @$(NORMAL_UNINSTALL) - @list='$(appman_DATA)'; for p in $$list; do \ - f=$(am__strip_dir) \ - echo " rm -f '$(DESTDIR)$(appmandir)/$$f'"; \ - rm -f "$(DESTDIR)$(appmandir)/$$f"; \ - done + @list='$(appman_DATA)'; test -n "$(appmandir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(appmandir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(appmandir)" && rm -f $$files ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ @@ -449,36 +491,41 @@ TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) - test -d $(distdir) || mkdir $(distdir) + test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -494,24 +541,29 @@ distdir: $(DISTFILES) if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook - -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r $(distdir) + || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) @@ -523,6 +575,10 @@ dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) + dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) @@ -552,6 +608,8 @@ distcheck: dist bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ @@ -563,9 +621,11 @@ distcheck: dist mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && cd $(distdir)/_build \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ @@ -587,13 +647,15 @@ distcheck: dist && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: - @cd $(distuninstallcheck_dir) \ + @$(am__cd) '$(distuninstallcheck_dir)' \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ @@ -640,6 +702,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -664,6 +727,8 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: @@ -672,18 +737,28 @@ install-data-am: install-appmanDATA install-dvi: install-dvi-am +install-dvi-am: + install-exec-am: install-binPROGRAMS install-html: install-html-am +install-html-am: + install-info: install-info-am +install-info-am: + install-man: install-pdf: install-pdf-am +install-pdf-am: + install-ps: install-ps-am +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -707,23 +782,24 @@ ps-am: uninstall-am: uninstall-appmanDATA uninstall-binPROGRAMS -.MAKE: install-am install-strip +.MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ clean-binPROGRAMS clean-generic ctags dist dist-all dist-bzip2 \ - dist-gzip dist-hook dist-lzma dist-shar dist-tarZ dist-zip \ - distcheck distclean distclean-compile distclean-generic \ - distclean-hdr distclean-tags distcleancheck distdir \ - distuninstallcheck dvi dvi-am html html-am info info-am \ - install install-am install-appmanDATA install-binPROGRAMS \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-appmanDATA uninstall-binPROGRAMS + dist-gzip dist-hook dist-lzma dist-shar dist-tarZ dist-xz \ + dist-zip distcheck distclean distclean-compile \ + distclean-generic distclean-hdr distclean-tags distcleancheck \ + distdir distuninstallcheck dvi dvi-am html html-am info \ + info-am install install-am install-appmanDATA \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-appmanDATA \ + uninstall-binPROGRAMS .man.$(APP_MAN_SUFFIX): @@ -732,9 +808,10 @@ uninstall-am: uninstall-appmanDATA uninstall-binPROGRAMS .PHONY: ChangeLog ChangeLog: - (GIT_DIR=$(top_srcdir)/.git git-log > .changelog.tmp && mv .changelog.tmp ChangeLog; rm -f .changelog.tmp) || (touch ChangeLog; echo 'git directory not found: installing possibly empty changelog.' >&2) + $(CHANGELOG_CMD) dist-hook: ChangeLog + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/xkbcomp/README b/xkbcomp/README index 8dd7a58c3..89dc3e638 100644 --- a/xkbcomp/README +++ b/xkbcomp/README @@ -22,4 +22,3 @@ For information how to further enhance XKB configuration see 'README.enhancing' file. -$XFree86$ diff --git a/xkbcomp/README.config b/xkbcomp/README.config index 4d3f2d5ba..2cce52157 100644 --- a/xkbcomp/README.config +++ b/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/xkbcomp/README.enhancing b/xkbcomp/README.enhancing index a8456e891..746902c52 100644 --- a/xkbcomp/README.enhancing +++ b/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/xkbcomp/aclocal.m4 b/xkbcomp/aclocal.m4 index c02a45447..c9548c2ae 100644 --- a/xkbcomp/aclocal.m4 +++ b/xkbcomp/aclocal.m4 @@ -1,7 +1,7 @@ -# generated automatically by aclocal 1.10.1 -*- Autoconf -*- +# generated automatically by aclocal 1.11 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,8 +13,8 @@ m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(AC_AUTOCONF_VERSION, [2.61],, -[m4_warning([this file was generated for autoconf 2.61. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.63],, +[m4_warning([this file was generated for autoconf 2.63. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) @@ -87,16 +87,14 @@ fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], -[if test -n "$PKG_CONFIG"; then - if test -n "$$1"; then - pkg_cv_[]$1="$$1" - else - PKG_CHECK_EXISTS([$3], - [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], - [pkg_failed=yes]) - fi -else - pkg_failed=untried +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], + [pkg_failed=yes]) + else + pkg_failed=untried fi[]dnl ])# _PKG_CONFIG @@ -140,9 +138,9 @@ See the pkg-config man page for more details.]) if test $pkg_failed = yes; then _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then - $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1` else - $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD @@ -177,6 +175,7 @@ else fi[]dnl ])# PKG_CHECK_MODULES +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 @@ -224,7 +223,7 @@ AC_DEFUN([XORG_MACROS_VERSION],[ XORG_MACROS_needed_major=`echo $XORG_MACROS_needed_version | sed 's/\..*$//'` XORG_MACROS_needed_minor=`echo $XORG_MACROS_needed_version | sed -e 's/^[0-9]*\.//' -e 's/\..*$//'`] AC_MSG_CHECKING([if xorg-macros used to generate configure is at least ${XORG_MACROS_needed_major}.${XORG_MACROS_needed_minor}]) - [XORG_MACROS_version=1.1.5 + [XORG_MACROS_version=1.2.1 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 @@ -258,6 +257,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 @@ -370,7 +373,9 @@ 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 +if test x$XORG_SGML_PATH = x ; then + XORG_SGML_PATH=$prefix/share/sgml +fi HAVE_DEFS_ENT= if test x"$cross_compiling" = x"yes" ; then @@ -426,7 +431,9 @@ 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 +if test x$XORG_SGML_PATH = x ; then + XORG_SGML_PATH=$prefix/share/sgml +fi HAVE_DEFS_ENT= BUILDTXTDOC=no BUILDPDFDOC=no @@ -603,6 +610,31 @@ 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]) +if test "x$GCC" = xyes ; then + CWARNFLAGS="-Wall -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes \ +-Wmissing-declarations -Wnested-externs -fno-strict-aliasing \ +-Wbad-function-cast" + case `gcc -dumpversion` in + 3.4.* | 4.*) + 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 dnl Copyright 2005 Red Hat, Inc dnl dnl Permission to use, copy, modify, distribute, and sell this software and its @@ -649,14 +681,14 @@ AC_DEFUN([XORG_RELEASE_VERSION],[ AC_DEFINE_UNQUOTED([PACKAGE_VERSION_MAJOR], [`echo $PACKAGE_VERSION | cut -d . -f 1`], [Major version of this package]) - PVM=`echo $PACKAGE_VERSION | cut -d . -f 2` + PVM=`echo $PACKAGE_VERSION | cut -d . -f 2 | cut -d - -f 1` if test "x$PVM" = "x"; then PVM="0" fi AC_DEFINE_UNQUOTED([PACKAGE_VERSION_MINOR], [$PVM], [Minor version of this package]) - PVP=`echo $PACKAGE_VERSION | cut -d . -f 3` + PVP=`echo $PACKAGE_VERSION | cut -d . -f 3 | cut -d - -f 1` if test "x$PVP" = "x"; then PVP="0" fi @@ -665,7 +697,24 @@ AC_DEFUN([XORG_RELEASE_VERSION],[ [Patch version of this package]) ]) -# Copyright (C) 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc. +# XORG_CHANGELOG() +# ---------------- +# Minimum version: 1.2.0 +# +# Defines the variable CHANGELOG_CMD as the command to generate +# ChangeLog from git. +# +# Arrange that distcleancheck ignores ChangeLog left over by distclean. +# +AC_DEFUN([XORG_CHANGELOG], [ +CHANGELOG_CMD="(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)" +AC_SUBST([CHANGELOG_CMD]) +AC_SUBST([distcleancheck_listfiles], ['find . -type f ! -name ChangeLog -print']) +]) # XORG_CHANGELOG + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -677,10 +726,10 @@ AC_DEFUN([XORG_RELEASE_VERSION],[ # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.10' +[am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.10.1], [], +m4_if([$1], [1.11], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -694,12 +743,12 @@ m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. -# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.10.1])dnl +[AM_AUTOMAKE_VERSION([1.11])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -_AM_AUTOCONF_VERSION(AC_AUTOCONF_VERSION)]) +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- @@ -756,14 +805,14 @@ am_aux_dir=`cd $ac_aux_dir && pwd` # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006 +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 8 +# serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- @@ -776,6 +825,7 @@ AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' @@ -789,14 +839,14 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 9 +# serial 10 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, @@ -853,6 +903,16 @@ AC_CACHE_CHECK([dependency style of $depcc], if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and @@ -870,7 +930,17 @@ AC_CACHE_CHECK([dependency style of $depcc], done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested @@ -880,19 +950,23 @@ AC_CACHE_CHECK([dependency style of $depcc], break fi ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; none) break ;; esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message @@ -949,57 +1023,68 @@ _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -#serial 3 +#serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], -[for mf in $CONFIG_FILES; do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done done -done +} ])# _AM_OUTPUT_DEPENDENCY_COMMANDS @@ -1031,13 +1116,13 @@ AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2008 Free Software Foundation, Inc. +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 13 +# serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. @@ -1054,7 +1139,7 @@ AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.60])dnl +[AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl @@ -1105,8 +1190,8 @@ AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) -AM_PROG_INSTALL_SH -AM_PROG_INSTALL_STRIP +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. @@ -1114,24 +1199,37 @@ AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], - [_AM_DEPENDENCIES(OBJC)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header @@ -1154,7 +1252,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1165,7 +1263,14 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. @@ -1192,27 +1297,38 @@ AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering -# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005 +# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 +# serial 5 +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless `enable' is passed literally. +# For symmetry, `disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], -[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) - dnl maintainer-mode is disabled by default - AC_ARG_ENABLE(maintainer-mode, -[ --enable-maintainer-mode enable make rules and dependencies not useful +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], +[ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful (and sometimes confusing) to the casual installer], - USE_MAINTAINER_MODE=$enableval, - USE_MAINTAINER_MODE=no) + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) - AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE - AC_SUBST(MAINT)dnl + AC_SUBST([MAINT])dnl ] ) @@ -1220,13 +1336,13 @@ AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 3 +# serial 4 # AM_MAKE_INCLUDE() # ----------------- @@ -1235,7 +1351,7 @@ AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: - @echo done + @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. @@ -1245,24 +1361,24 @@ 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 +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote="\"" - _am_result=BSD - fi + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) @@ -1272,14 +1388,14 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005 +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 5 +# serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ @@ -1296,7 +1412,14 @@ AC_SUBST($1)]) AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " @@ -1334,13 +1457,13 @@ esac # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 3 +# serial 4 # _AM_MANGLE_OPTION(NAME) # ----------------------- @@ -1357,7 +1480,7 @@ AC_DEFUN([_AM_SET_OPTION], # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], -[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- @@ -1367,14 +1490,14 @@ AC_DEFUN([_AM_IF_OPTION], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 +# serial 5 # AM_SANITY_CHECK # --------------- @@ -1383,16 +1506,29 @@ AC_DEFUN([AM_SANITY_CHECK], # Just in case sleep 1 echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` + set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ @@ -1445,18 +1581,25 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006 Free Software Foundation, Inc. +# Copyright (C) 2006, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. +# serial 2 + # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) +# AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. diff --git a/xkbcomp/action.c b/xkbcomp/action.c index 8b0ba6507..3b82e647e 100644 --- a/xkbcomp/action.c +++ b/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/xkbcomp/action.h b/xkbcomp/action.h index 4a1166420..2fb7a5eb9 100644 --- a/xkbcomp/action.h +++ b/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/xkbcomp/alias.c b/xkbcomp/alias.c index f228b0d66..ba55d3d32 100644 --- a/xkbcomp/alias.c +++ b/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/xkbcomp/alias.h b/xkbcomp/alias.h index fd0338847..b6fac5bfa 100644 --- a/xkbcomp/alias.h +++ b/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/xkbcomp/compat.c b/xkbcomp/compat.c index 00eb72b81..03c29efdc 100644 --- a/xkbcomp/compat.c +++ b/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/xkbcomp/compat.h b/xkbcomp/compat.h index 4edf78879..799b215ee 100644 --- a/xkbcomp/compat.h +++ b/xkbcomp/compat.h @@ -1,4 +1,3 @@ -/* $XFree86$ */ #ifndef COMPAT_H #define COMPAT_H 1 diff --git a/xkbcomp/config.guess b/xkbcomp/config.guess index 278f9e9e0..ca2a03ca4 100644 --- a/xkbcomp/config.guess +++ b/xkbcomp/config.guess @@ -1,10 +1,10 @@ #! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, -# Inc. +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. -timestamp='2007-07-22' +timestamp='2008-01-08' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -56,8 +56,8 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -532,7 +532,7 @@ EOF echo rs6000-ibm-aix3.2 fi exit ;; - *:AIX:*:[45]) + *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 @@ -799,6 +799,9 @@ EOF EM64T | authenticamd) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks @@ -833,7 +836,14 @@ EOF echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu @@ -954,8 +964,8 @@ EOF x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; - xtensa:Linux:*:*) - echo xtensa-unknown-linux-gnu + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so diff --git a/xkbcomp/config.h.in b/xkbcomp/config.h.in index 1ca40928b..b0cfb7241 100644 --- a/xkbcomp/config.h.in +++ b/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/xkbcomp/config.sub b/xkbcomp/config.sub index 1761d8bdf..6759825a5 100644 --- a/xkbcomp/config.sub +++ b/xkbcomp/config.sub @@ -1,10 +1,10 @@ #! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, -# Inc. +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. -timestamp='2007-06-28' +timestamp='2008-01-16' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software @@ -72,8 +72,8 @@ Report bugs and patches to <config-patches@gnu.org>." version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -369,10 +369,14 @@ case $basic_machine in | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ - | xstormy16-* | xtensa-* \ + | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-*) ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) @@ -443,6 +447,14 @@ case $basic_machine in basic_machine=ns32k-sequent os=-dynix ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; c90) basic_machine=c90-cray os=-unicos @@ -668,6 +680,14 @@ case $basic_machine in basic_machine=m68k-isi os=-sysv ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; m88k-omron*) basic_machine=m88k-omron ;; @@ -813,6 +833,14 @@ case $basic_machine in basic_machine=i860-intel os=-osf ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; pbd) basic_machine=sparc-tti ;; @@ -1021,6 +1049,10 @@ case $basic_machine in basic_machine=tic6x-unknown os=-coff ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; tx39) basic_machine=mipstx39-unknown ;; diff --git a/xkbcomp/configure b/xkbcomp/configure index 7ee526ba5..5c61e6048 100644 --- a/xkbcomp/configure +++ b/xkbcomp/configure @@ -1,11 +1,11 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.61 for xkbcomp 1.0.5. +# Generated by GNU Autoconf 2.63 for xkbcomp 1.1.0. # # Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg>. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# 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. ## --------------------- ## @@ -17,7 +17,7 @@ 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+"$@"}'='"$@"' setopt NO_GLOB_SUBST @@ -39,17 +39,45 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' +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 - PATH_SEPARATOR=: + 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 - rm -f conf$$.sh + 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 # Support unset when possible. @@ -65,8 +93,6 @@ fi # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) -as_nl=' -' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. @@ -89,7 +115,7 @@ if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then - echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi @@ -102,17 +128,10 @@ PS2='> ' PS4='+ ' # NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - fi -done +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && @@ -134,7 +153,7 @@ as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -echo X/"$0" | +$as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -160,7 +179,7 @@ else as_have_required=no fi - if test $as_have_required = yes && (eval ": + if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } @@ -242,7 +261,7 @@ IFS=$as_save_IFS 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+"$@"}'='"$@"' setopt NO_GLOB_SUBST @@ -263,7 +282,7 @@ _ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # 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 @@ -343,10 +362,10 @@ fi 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+"$@"} + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi @@ -415,9 +434,10 @@ fi test \$exitcode = 0") || { echo No shell found that supports shell functions. - echo Please tell autoconf@gnu.org about your system, - echo including any error possibly output before this - echo message + 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. } @@ -453,7 +473,7 @@ test \$exitcode = 0") || { 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 + { $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 @@ -481,7 +501,6 @@ case `echo -n x` in *) ECHO_N='-n';; esac - if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -494,19 +513,22 @@ if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir - mkdir conf$$.dir -fi -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + 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' -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln + fi else as_ln_s='cp -p' fi @@ -531,10 +553,10 @@ else as_test_x=' eval sh -c '\'' if test -d "$1"; then - test -d "$1/."; + test -d "$1/."; else case $1 in - -*)set "./$1";; + -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi @@ -574,116 +596,169 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='xkbcomp' PACKAGE_TARNAME='xkbcomp' -PACKAGE_VERSION='1.0.5' -PACKAGE_STRING='xkbcomp 1.0.5' +PACKAGE_VERSION='1.1.0' +PACKAGE_STRING='xkbcomp 1.1.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 -datarootdir -datadir -sysconfdir -sharedstatedir -localstatedir -includedir -oldincludedir -docdir -infodir -htmldir -dvidir -pdfdir -psdir -libdir -localedir -mandir -DEFS -ECHO_C -ECHO_N -ECHO_T -LIBS -build_alias -host_alias -target_alias -INSTALL_PROGRAM -INSTALL_SCRIPT -INSTALL_DATA -am__isrc -CYGPATH_W -PACKAGE -VERSION -ACLOCAL -AUTOCONF -AUTOMAKE -AUTOHEADER -MAKEINFO -install_sh -STRIP -INSTALL_STRIP_PROGRAM -mkdir_p -AWK -SET_MAKE -am__leading_dot -AMTAR -am__tar -am__untar -MAINTAINER_MODE_TRUE -MAINTAINER_MODE_FALSE -MAINT -CC -CFLAGS -LDFLAGS -CPPFLAGS -ac_ct_CC -EXEEXT -OBJEXT -DEPDIR -am__include -am__quote -AMDEP_TRUE -AMDEP_FALSE -AMDEPBACKSLASH -CCDEPMODE -am__fastdepCC_TRUE -am__fastdepCC_FALSE -YACC -YFLAGS -PKG_CONFIG -XKBCOMP_CFLAGS -XKBCOMP_LIBS -build -build_cpu -build_vendor -build_os -host -host_cpu -host_vendor -host_os -APP_MAN_SUFFIX -LIB_MAN_SUFFIX -FILE_MAN_SUFFIX -MISC_MAN_SUFFIX -DRIVER_MAN_SUFFIX -ADMIN_MAN_SUFFIX -APP_MAN_DIR -LIB_MAN_DIR -FILE_MAN_DIR -MISC_MAN_DIR -DRIVER_MAN_DIR -ADMIN_MAN_DIR +# Factoring default headers for most tests. +ac_includes_default="\ +#include <stdio.h> +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif +#ifdef HAVE_SYS_STAT_H +# include <sys/stat.h> +#endif +#ifdef STDC_HEADERS +# include <stdlib.h> +# include <stddef.h> +#else +# ifdef HAVE_STDLIB_H +# include <stdlib.h> +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include <memory.h> +# endif +# include <string.h> +#endif +#ifdef HAVE_STRINGS_H +# include <strings.h> +#endif +#ifdef HAVE_INTTYPES_H +# include <inttypes.h> +#endif +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS LIBOBJS -LTLIBOBJS' +distcleancheck_listfiles +CHANGELOG_CMD +ADMIN_MAN_DIR +DRIVER_MAN_DIR +MISC_MAN_DIR +FILE_MAN_DIR +LIB_MAN_DIR +APP_MAN_DIR +ADMIN_MAN_SUFFIX +DRIVER_MAN_SUFFIX +MISC_MAN_SUFFIX +FILE_MAN_SUFFIX +LIB_MAN_SUFFIX +APP_MAN_SUFFIX +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +XKBCONFIGROOT +XKBCOMP_LIBS +XKBCOMP_CFLAGS +PKG_CONFIG +CWARNFLAGS +EGREP +GREP +CPP +YFLAGS +YACC +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_maintainer_mode +enable_dependency_tracking +with_xkb_config_root +with_release_version +' ac_precious_vars='build_alias host_alias target_alias @@ -694,6 +769,7 @@ LIBS CPPFLAGS YACC YFLAGS +CPP PKG_CONFIG XKBCOMP_CFLAGS XKBCOMP_LIBS' @@ -702,6 +778,8 @@ 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 @@ -800,13 +878,21 @@ do 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 ;; @@ -819,13 +905,21 @@ do 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'` - eval enable_$ac_feature=\$ac_optarg ;; + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ @@ -1016,22 +1110,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'` - eval with_$ac_package=\$ac_optarg ;; + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) - ac_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. @@ -1051,7 +1161,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; }; } ;; @@ -1060,16 +1170,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; }; } 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} ;; @@ -1078,22 +1188,38 @@ 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 directory names. +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 +fi + +# Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac - { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } done @@ -1108,7 +1234,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 @@ -1124,10 +1250,10 @@ test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - { echo "$as_me: error: Working directory cannot be determined" >&2 + { $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" || - { echo "$as_me: error: pwd does not report name of working directory" >&2 + { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } @@ -1135,12 +1261,12 @@ test "X$ac_ls_di" = "X$ac_pwd_ls_di" || if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$0" || -$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$0" : 'X\(//\)[^/]' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -echo X"$0" | + 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 @@ -1167,12 +1293,12 @@ else fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 + cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. @@ -1199,7 +1325,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.1.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1221,9 +1347,9 @@ Configuration: 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 @@ -1233,25 +1359,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] - --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] + --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 @@ -1269,11 +1395,12 @@ 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.1.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 @@ -1284,6 +1411,9 @@ Optional Features: Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-xkb-config-root=<paths> + Set default XKB config root (default: + ${datadir}/X11/xkb) --with-release-version=STRING Use release version string in package name @@ -1300,6 +1430,7 @@ Some influential environment variables: 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. + CPP C preprocessor PKG_CONFIG path to pkg-config utility XKBCOMP_CFLAGS C compiler flags for XKBCOMP, overriding pkg-config @@ -1317,15 +1448,17 @@ fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + 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/ ;; @@ -1361,7 +1494,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix echo && $SHELL "$ac_srcdir/configure" --help=recursive else - echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done @@ -1370,11 +1503,11 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -xkbcomp configure 1.0.5 -generated by GNU Autoconf 2.61 +xkbcomp configure 1.1.0 +generated by GNU Autoconf 2.63 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +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 @@ -1384,8 +1517,8 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by xkbcomp $as_me 1.0.5, which was -generated by GNU Autoconf 2.61. Invocation command line was +It was created by xkbcomp $as_me 1.1.0, which was +generated by GNU Autoconf 2.63. Invocation command line was $ $0 $@ @@ -1421,7 +1554,7 @@ 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 @@ -1456,7 +1589,7 @@ do | -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'" ;; @@ -1508,11 +1641,12 @@ _ASBOX case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 -echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + *_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 @@ -1542,9 +1676,9 @@ _ASBOX do eval ac_val=\$$ac_var case $ac_val in - *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - echo "$ac_var='\''$ac_val'\''" + $as_echo "$ac_var='\''$ac_val'\''" done | sort echo @@ -1559,9 +1693,9 @@ _ASBOX do eval ac_val=\$$ac_var case $ac_val in - *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - echo "$ac_var='\''$ac_val'\''" + $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi @@ -1577,8 +1711,8 @@ _ASBOX 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 core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && @@ -1620,21 +1754,24 @@ _ACEOF # Let the site file select an alternate cache file if it wants to. -# Prefer explicitly selected file to automatically selected ones. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - set x "$CONFIG_SITE" + ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then - set x "$prefix/share/config.site" "$prefix/etc/config.site" + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site else - set x "$ac_default_prefix/share/config.site" \ - "$ac_default_prefix/etc/config.site" + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site fi -shift -for ac_site_file +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 @@ -1644,16 +1781,16 @@ 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";; 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 @@ -1667,29 +1804,38 @@ for ac_var in $ac_precious_vars; do 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 @@ -1699,10 +1845,12 @@ 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: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&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 @@ -1737,7 +1885,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -am__api_version='1.10' +am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do @@ -1756,8 +1904,8 @@ for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do 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 @@ -1783,11 +1931,12 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # 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 @@ -1816,17 +1965,29 @@ 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 @@ -1839,8 +2000,8 @@ fi 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. @@ -1850,21 +2011,38 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5 -echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; } +{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + { { $as_echo "$as_me:$LINENO: error: unsafe absolute working directory name" >&5 +$as_echo "$as_me: error: unsafe absolute working directory name" >&2;} + { (exit 1); exit 1; }; };; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + { { $as_echo "$as_me:$LINENO: error: unsafe srcdir value: \`$srcdir'" >&5 +$as_echo "$as_me: error: unsafe srcdir value: \`$srcdir'" >&2;} + { (exit 1); exit 1; }; };; +esac + # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` + set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ @@ -1874,9 +2052,9 @@ if ( # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". - { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken + { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 -echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi @@ -1887,45 +2065,158 @@ then # Ok. : else - { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! + { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 -echo "$as_me: error: newly created file is older than distributed files! +$as_echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi -{ echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. echo might interpret backslashes. +# 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 -f 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` -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= - { 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 -{ echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 -echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; } +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $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 +{ $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 + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test "${ac_cv_path_mkdir+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$PATH_SEPARATOR/opt/sfw/bin @@ -1960,8 +2251,8 @@ fi MKDIR_P="$ac_install_sh -d" fi fi -{ echo "$as_me:$LINENO: result: $MKDIR_P" >&5 -echo "${ECHO_T}$MKDIR_P" >&6; } +{ $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in @@ -1973,10 +2264,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. @@ -1989,7 +2280,7 @@ do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -2000,22 +2291,23 @@ 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 x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +{ $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 - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh @@ -2032,12 +2324,12 @@ esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } + { $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 @@ -2056,8 +2348,8 @@ if test "`cd $srcdir && pwd`" != "`pwd`"; then am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then - { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 -echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { { $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 fi @@ -2074,7 +2366,7 @@ fi # Define the identity of the package. PACKAGE='xkbcomp' - VERSION='1.0.5' + VERSION='1.1.0' cat >>confdefs.h <<_ACEOF @@ -2102,112 +2394,6 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} -install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} - -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { echo "$as_me:$LINENO: result: $STRIP" >&5 -echo "${ECHO_T}$STRIP" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_STRIP="strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -echo "${ECHO_T}$ac_ct_STRIP" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" - # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. @@ -2220,8 +2406,9 @@ 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; } + +{ $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 @@ -2229,8 +2416,8 @@ else USE_MAINTAINER_MODE=no fi - { echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 -echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6; } + { $as_echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' @@ -2243,6 +2430,31 @@ fi +# Require xorg-macros: XORG_CWARNFLAGS, XORG_CHANGELOG + + + XORG_MACROS_needed_version=1.2 + 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/\..*$//'` + { $as_echo "$as_me:$LINENO: checking if xorg-macros used to generate configure is at least ${XORG_MACROS_needed_major}.${XORG_MACROS_needed_minor}" >&5 +$as_echo_n "checking if xorg-macros used to generate configure is at least ${XORG_MACROS_needed_major}.${XORG_MACROS_needed_minor}... " >&6; } + XORG_MACROS_version=1.2.1 + 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 + { { $as_echo "$as_me:$LINENO: error: configure built with incompatible version of xorg-macros.m4 - requires version ${XORG_MACROS_major}.x" >&5 +$as_echo "$as_me: error: configure built with incompatible version of xorg-macros.m4 - requires version ${XORG_MACROS_major}.x" >&2;} + { (exit 1); exit 1; }; } + fi + if test $XORG_MACROS_minor -lt $XORG_MACROS_needed_minor ; then + { { $as_echo "$as_me:$LINENO: error: configure built with too old of a version of xorg-macros.m4 - requires version ${XORG_MACROS_major}.${XORG_MACROS_minor}.0 or newer" >&5 +$as_echo "$as_me: error: configure built with too old of a version of xorg-macros.m4 - requires version ${XORG_MACROS_major}.${XORG_MACROS_minor}.0 or newer" >&2;} + { (exit 1); exit 1; }; } + fi + { $as_echo "$as_me:$LINENO: result: yes, $XORG_MACROS_version" >&5 +$as_echo "yes, $XORG_MACROS_version" >&6; } + + ac_config_headers="$ac_config_headers config.h" @@ -2254,10 +2466,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. @@ -2270,7 +2482,7 @@ do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -2281,11 +2493,11 @@ 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 @@ -2294,10 +2506,10 @@ 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. @@ -2310,7 +2522,7 @@ do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -2321,11 +2533,11 @@ 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 if test "x$ac_ct_CC" = x; then @@ -2333,12 +2545,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC @@ -2351,10 +2559,10 @@ if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +{ $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. @@ -2367,7 +2575,7 @@ do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -2378,11 +2586,11 @@ 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 @@ -2391,10 +2599,10 @@ 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. @@ -2412,7 +2620,7 @@ do 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 @@ -2435,11 +2643,11 @@ 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 @@ -2450,10 +2658,10 @@ if test -z "$CC"; then 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. @@ -2466,7 +2674,7 @@ do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -2477,11 +2685,11 @@ 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 @@ -2494,10 +2702,10 @@ if test -z "$CC"; then 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. @@ -2510,7 +2718,7 @@ do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -2521,11 +2729,11 @@ 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 @@ -2537,12 +2745,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC @@ -2552,44 +2756,50 @@ 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: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $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; }; } + { (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` +$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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 +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); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 +eval ac_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); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 +eval ac_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 @@ -2608,27 +2818,22 @@ 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[^ ]*//'` -# -# List of possible output files, starting from the most likely. -# The algorithm is not robust to junk in `.', hence go to wildcards (a.*) -# only as a last resort. b.out is created by i960 compilers. -ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' -# -# The IRIX 6 linker writes into existing files which may not be -# executable, retaining their permissions. Remove them first so a -# subsequent execution test works. +{ $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 | *.o | *.obj ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done @@ -2639,10 +2844,11 @@ case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 +eval ac_try_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 # 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' @@ -2653,7 +2859,7 @@ for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) + *.$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 @@ -2680,25 +2886,27 @@ else ac_file='' fi -{ echo "$as_me:$LINENO: result: $ac_file" >&5 -echo "${ECHO_T}$ac_file" >&6; } +{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } if test -z "$ac_file"; then - 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: C compiler cannot create executables +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $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; }; } + { (exit 77); exit 77; }; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. -{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5 -echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } +{ $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 @@ -2707,49 +2915,53 @@ if test "$cross_compiling" != yes; then *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 +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: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $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; }; } + { (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 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; } +{ $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; } -{ echo "$as_me:$LINENO: checking for suffix of executables" >&5 -echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 +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 @@ -2758,31 +2970,33 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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 | *.map | *.inf | *.o | *.obj ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else - { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $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; }; } + { (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. */ @@ -2805,40 +3019,43 @@ case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 +eval ac_try_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 conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; + *.$ac_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: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $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; }; } + { (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. */ @@ -2864,20 +3081,21 @@ case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 +eval ac_try_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 + $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 @@ -2887,15 +3105,19 @@ 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 -{ 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 ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes @@ -2922,20 +3144,21 @@ case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 +eval ac_try_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 + $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 CFLAGS="" @@ -2960,20 +3183,21 @@ case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 +eval ac_try_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 + $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 - echo "$as_me: failed program was:" >&5 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag @@ -2999,20 +3223,21 @@ case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 +eval ac_try_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 + $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 @@ -3027,8 +3252,8 @@ fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi -{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } +{ $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 @@ -3044,10 +3269,10 @@ else CFLAGS= fi fi -{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 -echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } +{ $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 - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC @@ -3118,20 +3343,21 @@ case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 +eval ac_try_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 + $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 @@ -3147,15 +3373,15 @@ fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) - { echo "$as_me:$LINENO: result: none needed" >&5 -echo "${ECHO_T}none needed" >&6; } ;; + { $as_echo "$as_me:$LINENO: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; xno) - { echo "$as_me:$LINENO: result: unsupported" >&5 -echo "${ECHO_T}unsupported" >&6; } ;; + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" - { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac @@ -3172,40 +3398,40 @@ ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: - @echo done + @echo this is the am__doit target .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; } +{ $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 +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote="\"" - _am_result=BSD - fi + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac fi -{ echo "$as_me:$LINENO: result: $_am_result" >&5 -echo "${ECHO_T}$_am_result" >&6; } +{ $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. @@ -3229,10 +3455,10 @@ 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 @@ -3257,6 +3483,11 @@ else if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and @@ -3274,7 +3505,17 @@ else done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested @@ -3284,19 +3525,23 @@ else break fi ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; none) break ;; esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message @@ -3320,8 +3565,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 if @@ -3339,10 +3584,10 @@ for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +{ $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 - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. @@ -3355,7 +3600,7 @@ do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_YACC="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3366,11 +3611,11 @@ fi 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: $YACC" >&5 +$as_echo "$YACC" >&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 @@ -3391,11 +3636,12 @@ test -n "$YACC" || YACC="yacc" # 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 @@ -3424,17 +3670,29 @@ 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 @@ -3447,8 +3705,8 @@ fi 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. @@ -3459,6 +3717,810 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +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 + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >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 +{ $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 + $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 + : +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $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 + +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$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + 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 + +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 +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <stdlib.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >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; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + +if test "x$GCC" = xyes ; then + CWARNFLAGS="-Wall -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes \ +-Wmissing-declarations -Wnested-externs -fno-strict-aliasing \ +-Wbad-function-cast" + case `gcc -dumpversion` in + 3.4.* | 4.*) + 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=$? + 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 + + 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 "x$ac_cv_have_decl___SUNPRO_C" = x""yes; then + SUNCC="yes" +else + SUNCC="no" +fi + + if test "x$SUNCC" = "xyes"; then + CWARNFLAGS="-v" + fi +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 + +#undef $ac_func + +/* 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 + + eval "$as_ac_var=no" +fi + +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; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + # Checks for pkg-config packages @@ -3466,10 +4528,10 @@ 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 [\\/]* | ?:[\\/]*) @@ -3484,7 +4546,7 @@ do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3496,11 +4558,11 @@ 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 @@ -3509,10 +4571,10 @@ 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 [\\/]* | ?:[\\/]*) @@ -3527,7 +4589,7 @@ do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3539,11 +4601,11 @@ 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 if test "x$ac_pt_PKG_CONFIG" = x; then @@ -3551,12 +4613,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG @@ -3568,58 +4626,54 @@ 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 pkg_failed=no -{ echo "$as_me:$LINENO: checking for XKBCOMP" >&5 -echo $ECHO_N "checking for XKBCOMP... $ECHO_C" >&6; } - -if test -n "$PKG_CONFIG"; then - if test -n "$XKBCOMP_CFLAGS"; then - pkg_cv_XKBCOMP_CFLAGS="$XKBCOMP_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ - { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"x11 xkbfile\"") >&5 +{ $as_echo "$as_me:$LINENO: checking for XKBCOMP" >&5 +$as_echo_n "checking for XKBCOMP... " >&6; } + +if test -n "$XKBCOMP_CFLAGS"; then + pkg_cv_XKBCOMP_CFLAGS="$XKBCOMP_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { ($as_echo "$as_me:$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 + $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 + else + pkg_failed=untried fi -if test -n "$PKG_CONFIG"; then - if test -n "$XKBCOMP_LIBS"; then - pkg_cv_XKBCOMP_LIBS="$XKBCOMP_LIBS" - else - if test -n "$PKG_CONFIG" && \ - { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"x11 xkbfile\"") >&5 +if test -n "$XKBCOMP_LIBS"; then + pkg_cv_XKBCOMP_LIBS="$XKBCOMP_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { ($as_echo "$as_me:$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 + $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 + else + pkg_failed=untried fi @@ -3632,14 +4686,14 @@ 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"` + XKBCOMP_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "x11 xkbfile" 2>&1` else - XKBCOMP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "x11 xkbfile"` + XKBCOMP_PKG_ERRORS=`$PKG_CONFIG --print-errors "x11 xkbfile" 2>&1` 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: error: Package requirements (x11 xkbfile) were not met: $XKBCOMP_PKG_ERRORS @@ -3650,7 +4704,7 @@ 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: +$as_echo "$as_me: error: Package requirements (x11 xkbfile) were not met: $XKBCOMP_PKG_ERRORS @@ -3663,7 +4717,9 @@ 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 + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $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. @@ -3673,7 +4729,7 @@ See the pkg-config man page for more details. To get pkg-config, see <http://pkg-config.freedesktop.org/>. See \`config.log' for more details." >&5 -echo "$as_me: error: The pkg-config script could not be found or is too old. Make sure it +$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. @@ -3683,47 +4739,58 @@ See the pkg-config man page for more details. To get pkg-config, see <http://pkg-config.freedesktop.org/>. See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } + { (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; } + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } : fi +XKBCOMP_CFLAGS="$CWARNFLAGS $XKBCOMP_CFLAGS" + + + + +# 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 # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 -echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { { $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; }; } -{ echo "$as_me:$LINENO: checking build system type" >&5 -echo $ECHO_N "checking build system type... $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 - echo $ECHO_N "(cached) $ECHO_C" >&6 + $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 && - { { 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;} + { { $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` || - { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 -echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { { $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; }; } fi -{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5 -echo "${ECHO_T}$ac_cv_build" >&6; } +{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; -*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 -echo "$as_me: error: invalid value of canonical build" >&2;} +*) { { $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 @@ -3740,27 +4807,27 @@ IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac -{ echo "$as_me:$LINENO: checking host system type" >&5 -echo $ECHO_N "checking host system type... $ECHO_C" >&6; } +{ $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 - echo $ECHO_N "(cached) $ECHO_C" >&6 + $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 -echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { { $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 -{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5 -echo "${ECHO_T}$ac_cv_host" >&6; } +{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; -*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 -echo "$as_me: error: invalid value of canonical host" >&2;} +*) { { $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 @@ -3860,15 +4927,15 @@ 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;} + { $as_echo "$as_me:$LINENO: Building with package name set to $PACKAGE" >&5 +$as_echo "$as_me: Building with package name set to $PACKAGE" >&6;} fi cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION_MAJOR `echo $PACKAGE_VERSION | cut -d . -f 1` _ACEOF - PVM=`echo $PACKAGE_VERSION | cut -d . -f 2` + PVM=`echo $PACKAGE_VERSION | cut -d . -f 2 | cut -d - -f 1` if test "x$PVM" = "x"; then PVM="0" fi @@ -3877,7 +4944,7 @@ cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION_MINOR $PVM _ACEOF - PVP=`echo $PACKAGE_VERSION | cut -d . -f 3` + PVP=`echo $PACKAGE_VERSION | cut -d . -f 3 | cut -d - -f 1` if test "x$PVP" = "x"; then PVP="0" fi @@ -3888,6 +4955,14 @@ _ACEOF +CHANGELOG_CMD="(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)" + +distcleancheck_listfiles='find . -type f ! -name ChangeLog -print' + + + ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF @@ -3917,11 +4992,12 @@ _ACEOF case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 -echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; + *_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 @@ -3954,12 +5030,12 @@ echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && - { echo "$as_me:$LINENO: updating cache $cache_file" >&5 -echo "$as_me: updating cache $cache_file" >&6;} + { $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 "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 -echo "$as_me: not updating unwritable cache $cache_file" >&6;} + { $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 @@ -3975,7 +5051,7 @@ ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`echo "$ac_i" | sed "$ac_script"` + 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" @@ -3986,34 +5062,43 @@ LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then - { { 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. @@ -4026,7 +5111,7 @@ ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## @@ -4036,7 +5121,7 @@ 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+"$@"}'='"$@"' setopt NO_GLOB_SUBST @@ -4058,17 +5143,45 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' +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 - PATH_SEPARATOR=: + 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 - rm -f conf$$.sh + 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 # Support unset when possible. @@ -4084,8 +5197,6 @@ fi # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) -as_nl=' -' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. @@ -4108,7 +5219,7 @@ if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then - echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi @@ -4121,17 +5232,10 @@ PS2='> ' PS4='+ ' # NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - fi -done +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && @@ -4153,7 +5257,7 @@ as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -echo X/"$0" | +$as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -4204,7 +5308,7 @@ $as_unset CDPATH 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 + { $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 @@ -4232,7 +5336,6 @@ case `echo -n x` in *) ECHO_N='-n';; esac - if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr @@ -4245,19 +5348,22 @@ if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir - mkdir conf$$.dir -fi -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + 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' -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln + fi else as_ln_s='cp -p' fi @@ -4282,10 +5388,10 @@ else as_test_x=' eval sh -c '\'' if test -d "$1"; then - test -d "$1/."; + test -d "$1/."; else case $1 in - -*)set "./$1";; + -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi @@ -4307,8 +5413,8 @@ exec 6>&1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by xkbcomp $as_me 1.0.5, which was -generated by GNU Autoconf 2.61. Invocation command line was +This file was extended by xkbcomp $as_me 1.1.0, which was +generated by GNU Autoconf 2.63. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -4321,7 +5427,16 @@ on `(hostname || uname -n) 2>/dev/null | sed 1q` _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" @@ -4329,22 +5444,23 @@ config_commands="$ac_config_commands" _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. -Usage: $0 [OPTIONS] [FILE]... +Usage: $0 [OPTION]... [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit - -q, --quiet do not print progress messages + -q, --quiet, --silent + do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE Configuration files: $config_files @@ -4358,13 +5474,13 @@ $config_commands Report bugs to <bug-autoconf@gnu.org>." _ACEOF -cat >>$CONFIG_STATUS <<_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.61, - with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" +xkbcomp config.status 1.1.0 +configured by $0, generated by GNU Autoconf 2.63, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" -Copyright (C) 2006 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." @@ -4372,11 +5488,12 @@ ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' +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 @@ -4398,30 +5515,36 @@ do -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - echo "$ac_cs_version"; exit ;; + $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 - { echo "$as_me: error: ambiguous option: $1 + { $as_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 ;; + $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: error: unrecognized option: $1 + -*) { $as_echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; @@ -4440,27 +5563,29 @@ 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 CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 - CONFIG_SHELL=$SHELL + 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 $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + exec "\$@" fi _ACEOF -cat >>$CONFIG_STATUS <<\_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 - echo "$ac_log" + $as_echo "$ac_log" } >&5 _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # @@ -4468,7 +5593,7 @@ AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets @@ -4478,8 +5603,8 @@ do "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + *) { { $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 @@ -4520,211 +5645,144 @@ $debug || (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 sed scripts for CONFIG_FILES section. -# - -# No need to generate the scripts if there are no CONFIG_FILES. -# This happens for instance when ./config.status config.h +# 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 -_ACEOF - - - -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - cat >conf$$subs.sed <<_ACEOF -SHELL!$SHELL$ac_delim -PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim -PACKAGE_NAME!$PACKAGE_NAME$ac_delim -PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim -PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim -PACKAGE_STRING!$PACKAGE_STRING$ac_delim -PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim -exec_prefix!$exec_prefix$ac_delim -prefix!$prefix$ac_delim -program_transform_name!$program_transform_name$ac_delim -bindir!$bindir$ac_delim -sbindir!$sbindir$ac_delim -libexecdir!$libexecdir$ac_delim -datarootdir!$datarootdir$ac_delim -datadir!$datadir$ac_delim -sysconfdir!$sysconfdir$ac_delim -sharedstatedir!$sharedstatedir$ac_delim -localstatedir!$localstatedir$ac_delim -includedir!$includedir$ac_delim -oldincludedir!$oldincludedir$ac_delim -docdir!$docdir$ac_delim -infodir!$infodir$ac_delim -htmldir!$htmldir$ac_delim -dvidir!$dvidir$ac_delim -pdfdir!$pdfdir$ac_delim -psdir!$psdir$ac_delim -libdir!$libdir$ac_delim -localedir!$localedir$ac_delim -mandir!$mandir$ac_delim -DEFS!$DEFS$ac_delim -ECHO_C!$ECHO_C$ac_delim -ECHO_N!$ECHO_N$ac_delim -ECHO_T!$ECHO_T$ac_delim -LIBS!$LIBS$ac_delim -build_alias!$build_alias$ac_delim -host_alias!$host_alias$ac_delim -target_alias!$target_alias$ac_delim -INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim -INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim -INSTALL_DATA!$INSTALL_DATA$ac_delim -am__isrc!$am__isrc$ac_delim -CYGPATH_W!$CYGPATH_W$ac_delim -PACKAGE!$PACKAGE$ac_delim -VERSION!$VERSION$ac_delim -ACLOCAL!$ACLOCAL$ac_delim -AUTOCONF!$AUTOCONF$ac_delim -AUTOMAKE!$AUTOMAKE$ac_delim -AUTOHEADER!$AUTOHEADER$ac_delim -MAKEINFO!$MAKEINFO$ac_delim -install_sh!$install_sh$ac_delim -STRIP!$STRIP$ac_delim -INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim -mkdir_p!$mkdir_p$ac_delim -AWK!$AWK$ac_delim -SET_MAKE!$SET_MAKE$ac_delim -am__leading_dot!$am__leading_dot$ac_delim -AMTAR!$AMTAR$ac_delim -am__tar!$am__tar$ac_delim -am__untar!$am__untar$ac_delim -MAINTAINER_MODE_TRUE!$MAINTAINER_MODE_TRUE$ac_delim -MAINTAINER_MODE_FALSE!$MAINTAINER_MODE_FALSE$ac_delim -MAINT!$MAINT$ac_delim -CC!$CC$ac_delim -CFLAGS!$CFLAGS$ac_delim -LDFLAGS!$LDFLAGS$ac_delim -CPPFLAGS!$CPPFLAGS$ac_delim -ac_ct_CC!$ac_ct_CC$ac_delim -EXEEXT!$EXEEXT$ac_delim -OBJEXT!$OBJEXT$ac_delim -DEPDIR!$DEPDIR$ac_delim -am__include!$am__include$ac_delim -am__quote!$am__quote$ac_delim -AMDEP_TRUE!$AMDEP_TRUE$ac_delim -AMDEP_FALSE!$AMDEP_FALSE$ac_delim -AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim -CCDEPMODE!$CCDEPMODE$ac_delim -am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim -am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim -YACC!$YACC$ac_delim -YFLAGS!$YFLAGS$ac_delim -PKG_CONFIG!$PKG_CONFIG$ac_delim -XKBCOMP_CFLAGS!$XKBCOMP_CFLAGS$ac_delim -XKBCOMP_LIBS!$XKBCOMP_LIBS$ac_delim -build!$build$ac_delim -build_cpu!$build_cpu$ac_delim -build_vendor!$build_vendor$ac_delim -build_os!$build_os$ac_delim -host!$host$ac_delim -host_cpu!$host_cpu$ac_delim -host_vendor!$host_vendor$ac_delim -host_os!$host_os$ac_delim -APP_MAN_SUFFIX!$APP_MAN_SUFFIX$ac_delim -LIB_MAN_SUFFIX!$LIB_MAN_SUFFIX$ac_delim -FILE_MAN_SUFFIX!$FILE_MAN_SUFFIX$ac_delim -MISC_MAN_SUFFIX!$MISC_MAN_SUFFIX$ac_delim -DRIVER_MAN_SUFFIX!$DRIVER_MAN_SUFFIX$ac_delim -ADMIN_MAN_SUFFIX!$ADMIN_MAN_SUFFIX$ac_delim -_ACEOF - - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then - break - elif $ac_last_try; then - { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` -if test -n "$ac_eof"; then - ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` - ac_eof=`expr $ac_eof + 1` +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 -cat >>$CONFIG_STATUS <<_ACEOF -cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -_ACEOF -sed ' -s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g -s/^/s,@/; s/!/@,|#_!!_#|/ -:n -t n -s/'"$ac_delim"'$/,g/; t -s/$/\\/; p -N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n -' >>$CONFIG_STATUS <conf$$subs.sed -rm -f conf$$subs.sed -cat >>$CONFIG_STATUS <<_ACEOF -CEOF$ac_eof +echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF +{ + 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 - cat >conf$$subs.sed <<_ACEOF -APP_MAN_DIR!$APP_MAN_DIR$ac_delim -LIB_MAN_DIR!$LIB_MAN_DIR$ac_delim -FILE_MAN_DIR!$FILE_MAN_DIR$ac_delim -MISC_MAN_DIR!$MISC_MAN_DIR$ac_delim -DRIVER_MAN_DIR!$DRIVER_MAN_DIR$ac_delim -ADMIN_MAN_DIR!$ADMIN_MAN_DIR$ac_delim -LIBOBJS!$LIBOBJS$ac_delim -LTLIBOBJS!$LTLIBOBJS$ac_delim -_ACEOF + . ./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; }; } - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 8; then + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then - { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { { $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 -ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` -if test -n "$ac_eof"; then - ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` - ac_eof=`expr $ac_eof + 1` -fi +cat >>$CONFIG_STATUS <<_ACEOF || 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 = "" + +} +{ + 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 +} -cat >>$CONFIG_STATUS <<_ACEOF -cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end +_ACAWK _ACEOF -sed ' -s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g -s/^/s,@/; s/!/@,|#_!!_#|/ -:n -t n -s/'"$ac_delim"'$/,g/; t -s/$/\\/; p -N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n -' >>$CONFIG_STATUS <conf$$subs.sed -rm -f conf$$subs.sed -cat >>$CONFIG_STATUS <<_ACEOF -:end -s/|#_!!_#|//g -CEOF$ac_eof +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 @@ -4740,19 +5798,133 @@ s/^[^=]*=[ ]*$// }' fi -cat >>$CONFIG_STATUS <<\_ACEOF +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 + +# 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] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + { { $as_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" + -for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS +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*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 -echo "$as_me: error: Invalid tag $ac_tag." >&2;} + :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;; @@ -4781,26 +5953,38 @@ echo "$as_me: error: Invalid tag $ac_tag." >&2;} [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 -echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { { $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 - ac_file_inputs="$ac_file_inputs $ac_f" + 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 "`IFS=: - echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." + 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" - { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} + { $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";; + *:-:* | *:-) 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 @@ -4810,7 +5994,7 @@ $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" | +$as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -4836,7 +6020,7 @@ echo X"$ac_file" | as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -4845,7 +6029,7 @@ $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" | +$as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -4866,17 +6050,17 @@ echo X"$as_dir" | test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -echo "$as_me: error: cannot create directory $as_dir" >&2;} + } || 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=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` + 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/ ;; @@ -4921,12 +6105,13 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix esac _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= -case `sed -n '/datarootdir/ { +ac_sed_dataroot=' +/datarootdir/ { p q } @@ -4935,13 +6120,14 @@ case `sed -n '/datarootdir/ { /@infodir@/p /@localedir@/p /@mandir@/p -' $ac_file_inputs` in +' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + { $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 +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g @@ -4955,15 +6141,16 @@ _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF - sed "$ac_vpsub +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|@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 @@ -4974,121 +6161,60 @@ s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack -" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out +" +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; }; } test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' + { $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 -echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in - -) cat "$tmp/out"; rm -f "$tmp/out";; - *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; - esac + -) 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; }; } ;; :H) # # CONFIG_HEADER # -_ACEOF - -# Transform confdefs.h into a sed script `conftest.defines', that -# substitutes the proper values into config.h.in to produce config.h. -rm -f conftest.defines conftest.tail -# First, append a space to every undef/define line, to ease matching. -echo 's/$/ /' >conftest.defines -# Then, protect against being on the right side of a sed subst, or in -# an unquoted here document, in config.status. If some macros were -# called several times there might be several #defines for the same -# symbol, which is useless. But do not sort them, since the last -# AC_DEFINE must be honored. -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where -# NAME is the cpp macro being defined, VALUE is the value it is being given. -# PARAMS is the parameter list in the macro definition--in most cases, it's -# just an empty string. -ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' -ac_dB='\\)[ (].*,\\1define\\2' -ac_dC=' ' -ac_dD=' ,' - -uniq confdefs.h | - sed -n ' - t rset - :rset - s/^[ ]*#[ ]*define[ ][ ]*// - t ok - d - :ok - s/[\\&,]/\\&/g - s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p - s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p - ' >>conftest.defines - -# Remove the space that was appended to ease matching. -# Then replace #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -# (The regexp can be short, since the line contains either #define or #undef.) -echo 's/ $// -s,^[ #]*u.*,/* & */,' >>conftest.defines - -# Break up conftest.defines: -ac_max_sed_lines=50 - -# First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" -# Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" -# Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" -# et cetera. -ac_in='$ac_file_inputs' -ac_out='"$tmp/out1"' -ac_nxt='"$tmp/out2"' - -while : -do - # Write a here document: - cat >>$CONFIG_STATUS <<_ACEOF - # First, check the format of the line: - cat >"\$tmp/defines.sed" <<\\CEOF -/^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def -/^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def -b -:def -_ACEOF - sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS - echo 'CEOF - sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS - ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in - sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail - grep . conftest.tail >/dev/null || break - rm -f conftest.defines - mv conftest.tail conftest.defines -done -rm -f conftest.defines conftest.tail - -echo "ac_result=$ac_in" >>$CONFIG_STATUS -cat >>$CONFIG_STATUS <<\_ACEOF if test x"$ac_file" != x-; then - echo "/* $configure_input */" >"$tmp/config.h" - cat "$ac_result" >>"$tmp/config.h" - if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then - { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 -echo "$as_me: $ac_file is unchanged" >&6;} + { + $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 - 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 - echo "/* $configure_input */" - cat "$ac_result" + $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 - rm -f "$tmp/out12" -# Compute $ac_file's index in $config_headers. -_am_arg=$ac_file +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in @@ -5103,7 +6229,7 @@ $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -echo X"$_am_arg" | +$as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -5123,30 +6249,40 @@ echo X"$_am_arg" | s/.*/./; q'`/stamp-h$_am_stamp_count ;; - :C) { echo "$as_me:$LINENO: executing $ac_file commands" >&5 -echo "$as_me: executing $ac_file commands" >&6;} + :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in - "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line - # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || -echo X"$mf" | +$as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -5164,33 +6300,33 @@ echo X"$mf" | q } s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || -echo X"$file" | +$as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -5208,7 +6344,7 @@ echo X"$file" | q } s/.*/./; q'` - { as_dir=$dirpart/$fdir + { as_dir=$dirpart/$fdir case $as_dir in #( -*) as_dir=./$as_dir;; esac @@ -5216,7 +6352,7 @@ echo X"$file" | as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -5225,7 +6361,7 @@ $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" | +$as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -5246,13 +6382,14 @@ echo X"$as_dir" | test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -echo "$as_me: error: cannot create directory $as_dir" >&2;} + } || 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" + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done done -done +} ;; esac @@ -5264,6 +6401,11 @@ _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. @@ -5285,4 +6427,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/xkbcomp/configure.ac b/xkbcomp/configure.ac index 2f3468fbb..4d55b6b36 100644 --- a/xkbcomp/configure.ac +++ b/xkbcomp/configure.ac @@ -21,22 +21,39 @@ 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) +AC_INIT(xkbcomp,[1.1.0], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],xkbcomp) AM_INIT_AUTOMAKE([dist-bzip2]) AM_MAINTAINER_MODE +# Require xorg-macros: XORG_CWARNFLAGS, XORG_CHANGELOG +m4_ifndef([XORG_MACROS_VERSION], [AC_FATAL([must install xorg-macros 1.2 or later before running autoconf/autogen])]) +XORG_MACROS_VERSION(1.2) + AM_CONFIG_HEADER(config.h) AC_PROG_CC AC_PROG_YACC AC_PROG_INSTALL +XORG_CWARNFLAGS + +AC_CHECK_FUNCS([strdup strcasecmp]) + # Checks for pkg-config packages PKG_CHECK_MODULES(XKBCOMP, x11 xkbfile) +XKBCOMP_CFLAGS="$CWARNFLAGS $XKBCOMP_CFLAGS" AC_SUBST(XKBCOMP_CFLAGS) AC_SUBST(XKBCOMP_LIBS) +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]) + XORG_MANPAGE_SECTIONS XORG_RELEASE_VERSION +XORG_CHANGELOG AC_OUTPUT([Makefile]) diff --git a/xkbcomp/expr.c b/xkbcomp/expr.c index 6e01d7daf..96fd95675 100644 --- a/xkbcomp/expr.c +++ b/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/xkbcomp/expr.h b/xkbcomp/expr.h index 065716da8..02519f941 100644 --- a/xkbcomp/expr.h +++ b/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/xkbcomp/geometry.c b/xkbcomp/geometry.c index 8e47d7e43..6eb3fb880 100644 --- a/xkbcomp/geometry.c +++ b/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/xkbcomp/indicators.c b/xkbcomp/indicators.c index 3061f3e27..d4a362fb8 100644 --- a/xkbcomp/indicators.c +++ b/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/xkbcomp/indicators.h b/xkbcomp/indicators.h index 041cacc17..35ae38a4c 100644 --- a/xkbcomp/indicators.h +++ b/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/xkbcomp/keycodes.c b/xkbcomp/keycodes.c index a86592e4d..1bff7fa14 100644 --- a/xkbcomp/keycodes.c +++ b/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,864 @@ #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; + const char *action; + + replace = (new->defs.merge == MergeReplace) || + (new->defs.merge == MergeOverride); + old = FindIndicatorByName(info, new->name); + if (old) + { + if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0)) + || (warningLevel > 9)) + { + WARN1("Multiple indicators named %s\n", + XkbAtomText(NULL, new->name, XkbMessage)); + if (old->ndx == new->ndx) + { + if (old->virtual != new->virtual) + { + if (replace) + old->virtual = new->virtual; + action = "Using %s instead of %s\n"; + } + else + { + action = "Identical definitions ignored\n"; + } + ACTION2(action, (old->virtual ? "virtual" : "real"), + (old->virtual ? "real" : "virtual")); + return True; + } + else + { + if (replace) + action = "Ignoring %d, using %d\n"; + else + action = "Using %d, ignoring %d\n"; + ACTION2(action, old->ndx, new->ndx); + } + if (replace) + { + if (info->leds == old) + info->leds = (IndicatorNameInfo *) old->defs.next; + else + { + IndicatorNameInfo *tmp; + tmp = info->leds; + for (; tmp != NULL; + tmp = (IndicatorNameInfo *) tmp->defs.next) + { + if (tmp->defs.next == (CommonInfo *) old) + { + tmp->defs.next = old->defs.next; + break; + } + } + } + uFree(old); + } + } + } + old = FindIndicatorByIndex(info, new->ndx); + if (old) + { + if (((old->defs.fileID == new->defs.fileID) && (warningLevel > 0)) + || (warningLevel > 9)) + { + WARN1("Multiple names for indicator %d\n", new->ndx); + if ((old->name == new->name) && (old->virtual == new->virtual)) + action = "Identical definitions ignored\n"; + else + { + const char *oldType, *newType; + Atom using, ignoring; + if (old->virtual) + oldType = "virtual indicator"; + else + oldType = "real indicator"; + if (new->virtual) + newType = "virtual indicator"; + else + newType = "real indicator"; + if (replace) + { + using = new->name; + ignoring = old->name; + } + else + { + using = old->name; + ignoring = new->name; + } + ACTION4("Using %s %s, ignoring %s %s\n", + oldType, XkbAtomText(NULL, using, XkbMessage), + newType, XkbAtomText(NULL, ignoring, XkbMessage)); + } + } + if (replace) + { + old->name = new->name; + old->virtual = new->virtual; + } + return True; + } + old = new; + new = NextIndicatorName(info); + if (!new) + { + WSGO1("Couldn't allocate name for indicator %d\n", new->ndx); + ACTION("Ignored\n"); + return False; + } + new->name = old->name; + new->ndx = old->ndx; + new->virtual = old->virtual; return True; } static void -ClearKeyNamesInfo(KeyNamesInfo *info) +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/xkbcomp/keycodes.h b/xkbcomp/keycodes.h index 9333718cc..11f4460fe 100644 --- a/xkbcomp/keycodes.h +++ b/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/xkbcomp/keymap.c b/xkbcomp/keymap.c index 86e9c9e8f..a419d8c42 100644 --- a/xkbcomp/keymap.c +++ b/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/xkbcomp/keytypes.c b/xkbcomp/keytypes.c index b09345b79..da55d755d 100644 --- a/xkbcomp/keytypes.c +++ b/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/xkbcomp/listing.c b/xkbcomp/listing.c index cc887b80d..146ecbab3 100644 --- a/xkbcomp/listing.c +++ b/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/xkbcomp/misc.c b/xkbcomp/misc.c index 91688f739..4990a7439 100644 --- a/xkbcomp/misc.c +++ b/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/xkbcomp/misc.h b/xkbcomp/misc.h index fd16db482..4fa4b6dde 100644 --- a/xkbcomp/misc.h +++ b/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/xkbcomp/parseutils.c b/xkbcomp/parseutils.c index bae18f902..ad1b0d182 100644 --- a/xkbcomp/parseutils.c +++ b/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,9 +23,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. ********************************************************/ -/* $XFree86$ */ -#define DEBUG_VAR_NOT_LOCAL #define DEBUG_VAR parseDebug #include "parseutils.h" #include "xkbpath.h" @@ -34,329 +31,361 @@ #include <X11/extensions/XKBgeom.h> #include <X11/Xalloca.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; @@ -365,384 +394,441 @@ ExprDef *act; ExprDef * CreateKeysymList(KeySym sym) { -ExprDef *def; + 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; - } + def = ExprCreate(ExprKeysymList, TypeSymbols); + if (def) + { + def->value.list.nSyms = 1; + def->value.list.szSyms = 2; + def->value.list.syms = uTypedCalloc(2, KeySym); + if (def->value.list.syms != NULL) + { + def->value.list.syms[0] = sym; + return def; + } } FATAL("Couldn't allocate expression for keysym list in parser\n"); return NULL; } ShapeDef * -ShapeDeclCreate(Atom name,OutlineDef *outlines) -{ -ShapeDef * shape; -OutlineDef * ol; - - shape= uTypedAlloc(ShapeDef); - if (shape!=NULL) { - bzero(shape,sizeof(ShapeDef)); - shape->common.stmtType= StmtShapeDef; - shape->common.next= NULL; - shape->merge= MergeDefault; - shape->name= name; - shape->nOutlines= 0; - shape->outlines= outlines; - for (ol=outlines;ol!=NULL;ol= (OutlineDef *)ol->common.next) { - if (ol->nPoints>0) - shape->nOutlines++; - } +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, KeySym sym) +{ + if (list->value.list.nSyms >= list->value.list.szSyms) + { + list->value.list.szSyms *= 2; + list->value.list.syms = uTypedRecalloc(list->value.list.syms, + list->value.list.nSyms, + list->value.list.szSyms, + KeySym); + if (list->value.list.syms == NULL) + { + FATAL("Couldn't resize list of symbols for append\n"); + return NULL; + } + } + list->value.list.syms[list->value.list.nSyms++] = sym; return list; } int -LookupKeysym(char *str,KeySym *sym_rtrn) +LookupKeysym(char *str, KeySym * sym_rtrn) { -KeySym sym; + KeySym sym; - if ((!str)||(uStrCaseCmp(str,"any")==0)||(uStrCaseCmp(str,"nosymbol")==0)) { - *sym_rtrn= NoSymbol; - return 1; + 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; + 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; + sym = XStringToKeysym(str); + if (sym != NoSymbol) + { + *sym_rtrn = sym; + return 1; } return 0; } IncludeStmt * -IncludeCreate(char *str,unsigned merge) -{ -IncludeStmt * incl,*first; -char * file,*map,*stmt,*tmp, *extra_data; -char nextop; -Bool haveSelf; - - haveSelf= False; - incl= first= NULL; - file= map= NULL; - tmp= str; - stmt= uStringDup(str); - while ((tmp)&&(*tmp)) { - if (XkbParseIncludeMap(&tmp,&file,&map,&nextop,&extra_data)) { - if ((file==NULL)&&(map==NULL)) { - if (haveSelf) - goto BAIL; - haveSelf= True; - } - if (first==NULL) - first= incl= uTypedAlloc(IncludeStmt); - else { - incl->next= uTypedAlloc(IncludeStmt); - incl= incl->next; - } - if (incl) { - incl->common.stmtType= StmtInclude; - incl->common.next= NULL; - incl->merge= merge; - incl->stmt= NULL; - incl->file= file; - incl->map= map; - incl->modifier= extra_data; - incl->path= NULL; - incl->next= NULL; - } - else { - WSGO("Allocation failure in IncludeCreate\n"); - ACTION("Using only part of the include\n"); - break; - } - if (nextop=='|') merge= MergeAugment; - else merge= MergeOverride; - } - else { - goto BAIL; - } - } - if (first) first->stmt= stmt; - else if (stmt) uFree(stmt); +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/xkbcomp/parseutils.h b/xkbcomp/parseutils.h index a431fac74..73a0ec8ca 100644 --- a/xkbcomp/parseutils.h +++ b/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 *scanStr; +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(KeySym /* sym */ + ); + +extern ShapeDef *ShapeDeclCreate(Atom /* name */ , + OutlineDef * /* outlines */ + ); + +extern OutlineDef *OutlineCreate(Atom /* field */ , + ExprDef * /* points */ + ); + +extern KeyDef *KeyDeclCreate(char * /* name */ , + ExprDef * /* expr */ + ); + +extern KeyDef *KeyDeclMerge(KeyDef * /* into */ , + KeyDef * /* from */ + ); + +extern RowDef *RowDeclCreate(KeyDef * /* keys */ + ); + +extern SectionDef *SectionDeclCreate(Atom /* name */ , + RowDef * /* rows */ + ); + +extern OverlayKeyDef *OverlayKeyCreate(char * /* under */ , + char * /* over */ + ); + +extern OverlayDef *OverlayDeclCreate(Atom /* name */ , + OverlayKeyDef * /* rows */ + ); + +extern DoodadDef *DoodadCreate(unsigned /* type */ , + Atom /* name */ , + VarDef * /* body */ + ); + +extern ExprDef *AppendKeysymList(ExprDef * /* list */ , + KeySym /* sym */ + ); + +extern int LookupKeysym(char * /* str */ , + KeySym * /* sym_rtrn */ + ); + +extern IncludeStmt *IncludeCreate(char * /* str */ , + unsigned /* merge */ + ); + +extern unsigned StmtSetMerge(ParseCommon * /* stmt */ , + unsigned /* merge */ + ); #ifdef DEBUG -extern void PrintStmtAddrs( - ParseCommon * /* stmt */ -); +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/xkbcomp/symbols.c b/xkbcomp/symbols.c index ffc26b2fd..47ad67b94 100644 --- a/xkbcomp/symbols.c +++ b/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,7 +23,6 @@ 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" @@ -41,9 +39,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 +58,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 +876,881 @@ 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); + memcpy((char *) key->syms[ndx], (char *) value->value.list.syms, + nSyms * sizeof(KeySym)); + for (i = key->numLevels[ndx] - 1; + (i >= 0) && (key->syms[ndx][i] == NoSymbol); i--) + { + key->numLevels[ndx]--; } return True; } static Bool -AddActionsToKey( KeyInfo * key, - XkbDescPtr xkb, - char * field, - ExprDef * arrayNdx, - ExprDef * value, - SymbolsInfo * info) +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 +1761,7 @@ KSIsLower (KeySym ks) } static Bool -KSIsUpper (KeySym ks) +KSIsUpper(KeySym ks) { KeySym lower, upper; XConvertCase(ks, &lower, &upper); @@ -1528,394 +1771,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/xkbcomp/tokens.h b/xkbcomp/tokens.h index c63c393a7..970f3d4de 100644 --- a/xkbcomp/tokens.h +++ b/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/xkbcomp/utils.c b/xkbcomp/utils.c index aa4dc8987..55efbe11f 100644 --- a/xkbcomp/utils.c +++ b/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/xkbcomp/utils.h b/xkbcomp/utils.h index ab84a4f7b..65e37c8a5 100644 --- a/xkbcomp/utils.h +++ b/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/xkbcomp/vmod.c b/xkbcomp/vmod.c index 9a8bd0d87..5578fd01f 100644 --- a/xkbcomp/vmod.c +++ b/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/xkbcomp/vmod.h b/xkbcomp/vmod.h index 231d2c8ba..559b9d504 100644 --- a/xkbcomp/vmod.h +++ b/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/xkbcomp/xkbcomp.c b/xkbcomp/xkbcomp.c index 111a7b371..988b5c575 100644 --- a/xkbcomp/xkbcomp.c +++ b/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,513 +182,683 @@ 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; } @@ -691,14 +867,14 @@ Display *dpy; extern int yydebug; 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 +882,331 @@ 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) + { + fclose(out); + if (!ok) + { + ERROR2("%s in %s\n", _XkbErrMessages[_XkbErrCode], + _XkbErrLocation ? _XkbErrLocation : "unknown"); + ACTION1("Output file \"%s\" removed\n", outputFile); + unlink(outputFile); + } + } } - if (inDpy) - XCloseDisplay(inDpy); - inDpy= NULL; + if (inDpy) + XCloseDisplay(inDpy); + inDpy = NULL; if (outDpy) - XCloseDisplay(outDpy); + XCloseDisplay(outDpy); uFinishUp(); - return (ok==0); + return (ok == 0); } diff --git a/xkbcomp/xkbcomp.h b/xkbcomp/xkbcomp.h index b9b9caed1..6e02ed59c 100644 --- a/xkbcomp/xkbcomp.h +++ b/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; + KeySym *syms; + } list; + struct + { + int x; + int y; + } coord; + struct _Expr *child; + Atom str; + unsigned uval; + int ival; + char keyName[5]; + Opaque ptr; } value; } ExprDef; -typedef struct _VarDef { - ParseCommon common; - unsigned merge; - ExprDef *name; - ExprDef *value; +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/xkbcomp/xkbcomp.man b/xkbcomp/xkbcomp.man index aa18d3e72..0e4d29454 100644 --- a/xkbcomp/xkbcomp.man +++ b/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/xkbcomp/xkbparse.c b/xkbcomp/xkbparse.c index 75fc1b106..96cb85274 100644 --- a/xkbcomp/xkbparse.c +++ b/xkbcomp/xkbparse.c @@ -200,7 +200,7 @@ /* Copy the first part of user declarations. */ -#line 93 "xkbparse.y" +#line 91 "xkbparse.y" #ifdef DEBUG #define YYDEBUG 1 @@ -211,6 +211,7 @@ #include <X11/extensions/XKBgeom.h> #include <stdlib.h> +unsigned int parseDebug; @@ -234,7 +235,7 @@ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE -#line 111 "xkbparse.y" +#line 110 "xkbparse.y" { int ival; unsigned uval; @@ -264,7 +265,7 @@ typedef union YYSTYPE XkbFile *file; } /* Line 187 of yacc.c. */ -#line 268 "xkbparse.c" +#line 269 "xkbparse.c" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 @@ -277,7 +278,7 @@ typedef union YYSTYPE /* Line 216 of yacc.c. */ -#line 281 "xkbparse.c" +#line 282 "xkbparse.c" #ifdef short # undef short @@ -632,23 +633,23 @@ static const yytype_int16 yyrhs[] = /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 169, 169, 171, 173, 177, 179, 183, 189, 190, - 191, 194, 196, 200, 206, 211, 212, 213, 214, 215, - 218, 219, 222, 223, 226, 227, 228, 229, 230, 231, - 232, 233, 236, 238, 241, 246, 251, 256, 261, 266, - 271, 276, 281, 286, 291, 296, 301, 306, 311, 323, - 325, 327, 331, 342, 352, 356, 358, 362, 364, 368, - 377, 379, 383, 385, 389, 395, 401, 403, 405, 408, - 410, 412, 414, 416, 420, 422, 426, 430, 434, 438, - 440, 444, 446, 454, 458, 460, 464, 466, 468, 470, - 472, 476, 478, 482, 484, 488, 490, 494, 496, 500, - 504, 509, 513, 517, 519, 523, 525, 527, 531, 533, - 537, 547, 551, 552, 553, 554, 557, 558, 561, 563, - 565, 567, 569, 571, 573, 575, 577, 579, 581, 585, - 586, 589, 590, 591, 592, 593, 596, 597, 600, 602, - 606, 608, 610, 612, 614, 616, 620, 622, 624, 626, - 628, 630, 632, 634, 638, 640, 644, 648, 655, 663, - 672, 683, 690, 697, 704, 715, 716, 719, 721, 725, + 0, 168, 168, 170, 172, 176, 178, 182, 188, 189, + 190, 193, 195, 199, 205, 210, 211, 212, 213, 214, + 217, 218, 221, 222, 225, 226, 227, 228, 229, 230, + 231, 232, 235, 237, 240, 245, 250, 255, 260, 265, + 270, 275, 280, 285, 290, 295, 300, 305, 310, 322, + 324, 326, 330, 341, 351, 355, 357, 361, 363, 367, + 376, 378, 382, 384, 388, 394, 400, 402, 404, 407, + 409, 411, 413, 415, 419, 421, 425, 429, 433, 437, + 439, 443, 445, 453, 457, 459, 463, 465, 467, 469, + 471, 475, 477, 481, 483, 487, 489, 493, 495, 499, + 503, 508, 512, 516, 518, 522, 524, 526, 530, 532, + 536, 546, 550, 551, 552, 553, 556, 557, 560, 562, + 564, 566, 568, 570, 572, 574, 576, 578, 580, 584, + 585, 588, 589, 590, 591, 592, 595, 596, 599, 601, + 605, 607, 609, 611, 613, 615, 619, 621, 623, 625, + 627, 629, 631, 633, 637, 639, 643, 647, 654, 662, + 671, 682, 689, 696, 703, 714, 715, 718, 720, 724, 739, 743, 750, 751, 754, 755, 758, 761, 764, 767, 768, 771, 774, 775, 778 }; @@ -1866,167 +1867,167 @@ yyreduce: switch (yyn) { case 2: -#line 170 "xkbparse.y" +#line 169 "xkbparse.y" { (yyval.file)= rtrnValue= (yyvsp[(1) - (1)].file); } break; case 3: -#line 172 "xkbparse.y" +#line 171 "xkbparse.y" { (yyval.file)= rtrnValue= (yyvsp[(1) - (1)].file); } break; case 4: -#line 174 "xkbparse.y" +#line 173 "xkbparse.y" { (yyval.file)= rtrnValue= (yyvsp[(1) - (1)].file); } break; case 5: -#line 178 "xkbparse.y" +#line 177 "xkbparse.y" { (yyval.file)= (XkbFile *)AppendStmt(&(yyvsp[(1) - (2)].file)->common,&(yyvsp[(2) - (2)].file)->common); } break; case 6: -#line 180 "xkbparse.y" +#line 179 "xkbparse.y" { (yyval.file)= (yyvsp[(1) - (1)].file); } break; case 7: -#line 186 "xkbparse.y" +#line 185 "xkbparse.y" { (yyval.file)= CreateXKBFile((yyvsp[(2) - (7)].uval),(yyvsp[(3) - (7)].str),&(yyvsp[(5) - (7)].file)->common,(yyvsp[(1) - (7)].uval)); } break; case 8: -#line 189 "xkbparse.y" +#line 188 "xkbparse.y" { (yyval.uval)= XkmKeymapFile; } break; case 9: -#line 190 "xkbparse.y" +#line 189 "xkbparse.y" { (yyval.uval)= XkmSemanticsFile; } break; case 10: -#line 191 "xkbparse.y" +#line 190 "xkbparse.y" { (yyval.uval)= XkmLayoutFile; } break; case 11: -#line 195 "xkbparse.y" +#line 194 "xkbparse.y" { (yyval.file)= (XkbFile *)AppendStmt(&(yyvsp[(1) - (2)].file)->common,&(yyvsp[(2) - (2)].file)->common); } break; case 12: -#line 197 "xkbparse.y" +#line 196 "xkbparse.y" { (yyval.file)= (yyvsp[(1) - (1)].file); } break; case 13: -#line 203 "xkbparse.y" +#line 202 "xkbparse.y" { (yyval.file)= CreateXKBFile((yyvsp[(2) - (7)].uval),(yyvsp[(3) - (7)].str),(yyvsp[(5) - (7)].any),(yyvsp[(1) - (7)].uval)); } break; case 14: -#line 207 "xkbparse.y" +#line 206 "xkbparse.y" { (yyval.file)= CreateXKBFile((yyvsp[(2) - (4)].uval),(yyvsp[(3) - (4)].str),(yyvsp[(4) - (4)].any),(yyvsp[(1) - (4)].uval)); } break; case 15: -#line 211 "xkbparse.y" +#line 210 "xkbparse.y" { (yyval.uval)= XkmKeyNamesIndex; } break; case 16: -#line 212 "xkbparse.y" +#line 211 "xkbparse.y" { (yyval.uval)= XkmTypesIndex; } break; case 17: -#line 213 "xkbparse.y" +#line 212 "xkbparse.y" { (yyval.uval)= XkmCompatMapIndex; } break; case 18: -#line 214 "xkbparse.y" +#line 213 "xkbparse.y" { (yyval.uval)= XkmSymbolsIndex; } break; case 19: -#line 215 "xkbparse.y" +#line 214 "xkbparse.y" { (yyval.uval)= XkmGeometryIndex; } break; case 20: -#line 218 "xkbparse.y" +#line 217 "xkbparse.y" { (yyval.uval)= (yyvsp[(1) - (1)].uval); } break; case 21: -#line 219 "xkbparse.y" +#line 218 "xkbparse.y" { (yyval.uval)= 0; } break; case 22: -#line 222 "xkbparse.y" +#line 221 "xkbparse.y" { (yyval.uval)= (((yyvsp[(1) - (2)].uval))|((yyvsp[(2) - (2)].uval))); } break; case 23: -#line 223 "xkbparse.y" +#line 222 "xkbparse.y" { (yyval.uval)= (yyvsp[(1) - (1)].uval); } break; case 24: -#line 226 "xkbparse.y" +#line 225 "xkbparse.y" { (yyval.uval)= XkbLC_Partial; } break; case 25: -#line 227 "xkbparse.y" +#line 226 "xkbparse.y" { (yyval.uval)= XkbLC_Default; } break; case 26: -#line 228 "xkbparse.y" +#line 227 "xkbparse.y" { (yyval.uval)= XkbLC_Hidden; } break; case 27: -#line 229 "xkbparse.y" +#line 228 "xkbparse.y" { (yyval.uval)= XkbLC_AlphanumericKeys; } break; case 28: -#line 230 "xkbparse.y" +#line 229 "xkbparse.y" { (yyval.uval)= XkbLC_ModifierKeys; } break; case 29: -#line 231 "xkbparse.y" +#line 230 "xkbparse.y" { (yyval.uval)= XkbLC_KeypadKeys; } break; case 30: -#line 232 "xkbparse.y" +#line 231 "xkbparse.y" { (yyval.uval)= XkbLC_FunctionKeys; } break; case 31: -#line 233 "xkbparse.y" +#line 232 "xkbparse.y" { (yyval.uval)= XkbLC_AlternateGroup; } break; case 32: -#line 237 "xkbparse.y" +#line 236 "xkbparse.y" { (yyval.any)= AppendStmt((yyvsp[(1) - (2)].any),(yyvsp[(2) - (2)].any)); } break; case 33: -#line 238 "xkbparse.y" +#line 237 "xkbparse.y" { (yyval.any)= NULL; } break; case 34: -#line 242 "xkbparse.y" +#line 241 "xkbparse.y" { (yyvsp[(2) - (2)].var)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].var)->common,(yyvsp[(1) - (2)].uval)); (yyval.any)= &(yyvsp[(2) - (2)].var)->common; @@ -2034,7 +2035,7 @@ yyreduce: break; case 35: -#line 247 "xkbparse.y" +#line 246 "xkbparse.y" { (yyvsp[(2) - (2)].vmod)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].vmod)->common,(yyvsp[(1) - (2)].uval)); (yyval.any)= &(yyvsp[(2) - (2)].vmod)->common; @@ -2042,7 +2043,7 @@ yyreduce: break; case 36: -#line 252 "xkbparse.y" +#line 251 "xkbparse.y" { (yyvsp[(2) - (2)].interp)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].interp)->common,(yyvsp[(1) - (2)].uval)); (yyval.any)= &(yyvsp[(2) - (2)].interp)->common; @@ -2050,7 +2051,7 @@ yyreduce: break; case 37: -#line 257 "xkbparse.y" +#line 256 "xkbparse.y" { (yyvsp[(2) - (2)].keyName)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].keyName)->common,(yyvsp[(1) - (2)].uval)); (yyval.any)= &(yyvsp[(2) - (2)].keyName)->common; @@ -2058,7 +2059,7 @@ yyreduce: break; case 38: -#line 262 "xkbparse.y" +#line 261 "xkbparse.y" { (yyvsp[(2) - (2)].keyAlias)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].keyAlias)->common,(yyvsp[(1) - (2)].uval)); (yyval.any)= &(yyvsp[(2) - (2)].keyAlias)->common; @@ -2066,7 +2067,7 @@ yyreduce: break; case 39: -#line 267 "xkbparse.y" +#line 266 "xkbparse.y" { (yyvsp[(2) - (2)].keyType)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].keyType)->common,(yyvsp[(1) - (2)].uval)); (yyval.any)= &(yyvsp[(2) - (2)].keyType)->common; @@ -2074,7 +2075,7 @@ yyreduce: break; case 40: -#line 272 "xkbparse.y" +#line 271 "xkbparse.y" { (yyvsp[(2) - (2)].syms)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].syms)->common,(yyvsp[(1) - (2)].uval)); (yyval.any)= &(yyvsp[(2) - (2)].syms)->common; @@ -2082,7 +2083,7 @@ yyreduce: break; case 41: -#line 277 "xkbparse.y" +#line 276 "xkbparse.y" { (yyvsp[(2) - (2)].modMask)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].modMask)->common,(yyvsp[(1) - (2)].uval)); (yyval.any)= &(yyvsp[(2) - (2)].modMask)->common; @@ -2090,7 +2091,7 @@ yyreduce: break; case 42: -#line 282 "xkbparse.y" +#line 281 "xkbparse.y" { (yyvsp[(2) - (2)].groupCompat)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].groupCompat)->common,(yyvsp[(1) - (2)].uval)); (yyval.any)= &(yyvsp[(2) - (2)].groupCompat)->common; @@ -2098,7 +2099,7 @@ yyreduce: break; case 43: -#line 287 "xkbparse.y" +#line 286 "xkbparse.y" { (yyvsp[(2) - (2)].ledMap)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].ledMap)->common,(yyvsp[(1) - (2)].uval)); (yyval.any)= &(yyvsp[(2) - (2)].ledMap)->common; @@ -2106,7 +2107,7 @@ yyreduce: break; case 44: -#line 292 "xkbparse.y" +#line 291 "xkbparse.y" { (yyvsp[(2) - (2)].ledName)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].ledName)->common,(yyvsp[(1) - (2)].uval)); (yyval.any)= &(yyvsp[(2) - (2)].ledName)->common; @@ -2114,7 +2115,7 @@ yyreduce: break; case 45: -#line 297 "xkbparse.y" +#line 296 "xkbparse.y" { (yyvsp[(2) - (2)].shape)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].shape)->common,(yyvsp[(1) - (2)].uval)); (yyval.any)= &(yyvsp[(2) - (2)].shape)->common; @@ -2122,7 +2123,7 @@ yyreduce: break; case 46: -#line 302 "xkbparse.y" +#line 301 "xkbparse.y" { (yyvsp[(2) - (2)].section)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].section)->common,(yyvsp[(1) - (2)].uval)); (yyval.any)= &(yyvsp[(2) - (2)].section)->common; @@ -2130,7 +2131,7 @@ yyreduce: break; case 47: -#line 307 "xkbparse.y" +#line 306 "xkbparse.y" { (yyvsp[(2) - (2)].doodad)->merge= StmtSetMerge(&(yyvsp[(2) - (2)].doodad)->common,(yyvsp[(1) - (2)].uval)); (yyval.any)= &(yyvsp[(2) - (2)].doodad)->common; @@ -2138,7 +2139,7 @@ yyreduce: break; case 48: -#line 312 "xkbparse.y" +#line 311 "xkbparse.y" { if ((yyvsp[(1) - (2)].uval)==MergeAltForm) { yyerror("cannot use 'alternate' to include other maps"); @@ -2151,22 +2152,22 @@ yyreduce: break; case 49: -#line 324 "xkbparse.y" +#line 323 "xkbparse.y" { (yyval.var)= VarCreate((yyvsp[(1) - (4)].expr),(yyvsp[(3) - (4)].expr)); } break; case 50: -#line 326 "xkbparse.y" +#line 325 "xkbparse.y" { (yyval.var)= BoolVarCreate((yyvsp[(1) - (2)].sval),1); } break; case 51: -#line 328 "xkbparse.y" +#line 327 "xkbparse.y" { (yyval.var)= BoolVarCreate((yyvsp[(2) - (3)].sval),0); } break; case 52: -#line 332 "xkbparse.y" +#line 331 "xkbparse.y" { KeycodeDef *def; @@ -2178,7 +2179,7 @@ yyreduce: break; case 53: -#line 343 "xkbparse.y" +#line 342 "xkbparse.y" { KeyAliasDef *def; def= KeyAliasCreate((yyvsp[(2) - (5)].str),(yyvsp[(4) - (5)].str)); @@ -2189,32 +2190,32 @@ yyreduce: break; case 54: -#line 353 "xkbparse.y" +#line 352 "xkbparse.y" { (yyval.vmod)= (yyvsp[(2) - (3)].vmod); } break; case 55: -#line 357 "xkbparse.y" +#line 356 "xkbparse.y" { (yyval.vmod)= (VModDef *)AppendStmt(&(yyvsp[(1) - (3)].vmod)->common,&(yyvsp[(3) - (3)].vmod)->common); } break; case 56: -#line 359 "xkbparse.y" +#line 358 "xkbparse.y" { (yyval.vmod)= (yyvsp[(1) - (1)].vmod); } break; case 57: -#line 363 "xkbparse.y" +#line 362 "xkbparse.y" { (yyval.vmod)= VModCreate((yyvsp[(1) - (1)].sval),NULL); } break; case 58: -#line 365 "xkbparse.y" +#line 364 "xkbparse.y" { (yyval.vmod)= VModCreate((yyvsp[(1) - (3)].sval),(yyvsp[(3) - (3)].expr)); } break; case 59: -#line 371 "xkbparse.y" +#line 370 "xkbparse.y" { (yyvsp[(2) - (6)].interp)->def= (yyvsp[(4) - (6)].var); (yyval.interp)= (yyvsp[(2) - (6)].interp); @@ -2222,117 +2223,117 @@ yyreduce: break; case 60: -#line 378 "xkbparse.y" +#line 377 "xkbparse.y" { (yyval.interp)= InterpCreate((KeySym)(yyvsp[(1) - (3)].uval),(yyvsp[(3) - (3)].expr)); } break; case 61: -#line 380 "xkbparse.y" +#line 379 "xkbparse.y" { (yyval.interp)= InterpCreate((KeySym)(yyvsp[(1) - (1)].uval),NULL); } break; case 62: -#line 384 "xkbparse.y" +#line 383 "xkbparse.y" { (yyval.var)= (VarDef *)AppendStmt(&(yyvsp[(1) - (2)].var)->common,&(yyvsp[(2) - (2)].var)->common); } break; case 63: -#line 386 "xkbparse.y" +#line 385 "xkbparse.y" { (yyval.var)= (yyvsp[(1) - (1)].var); } break; case 64: -#line 392 "xkbparse.y" +#line 391 "xkbparse.y" { (yyval.keyType)= KeyTypeCreate((yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].var)); } break; case 65: -#line 398 "xkbparse.y" +#line 397 "xkbparse.y" { (yyval.syms)= SymbolsCreate((yyvsp[(2) - (6)].str),(ExprDef *)(yyvsp[(4) - (6)].var)); } break; case 66: -#line 402 "xkbparse.y" +#line 401 "xkbparse.y" { (yyval.var)= (VarDef *)AppendStmt(&(yyvsp[(1) - (3)].var)->common,&(yyvsp[(3) - (3)].var)->common); } break; case 67: -#line 404 "xkbparse.y" +#line 403 "xkbparse.y" { (yyval.var)= (yyvsp[(1) - (1)].var); } break; case 68: -#line 405 "xkbparse.y" +#line 404 "xkbparse.y" { (yyval.var)= NULL; } break; case 69: -#line 409 "xkbparse.y" +#line 408 "xkbparse.y" { (yyval.var)= VarCreate((yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); } break; case 70: -#line 411 "xkbparse.y" +#line 410 "xkbparse.y" { (yyval.var)= VarCreate((yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); } break; case 71: -#line 413 "xkbparse.y" +#line 412 "xkbparse.y" { (yyval.var)= BoolVarCreate((yyvsp[(1) - (1)].sval),1); } break; case 72: -#line 415 "xkbparse.y" +#line 414 "xkbparse.y" { (yyval.var)= BoolVarCreate((yyvsp[(2) - (2)].sval),0); } break; case 73: -#line 417 "xkbparse.y" +#line 416 "xkbparse.y" { (yyval.var)= VarCreate(NULL,(yyvsp[(1) - (1)].expr)); } break; case 74: -#line 421 "xkbparse.y" +#line 420 "xkbparse.y" { (yyval.expr)= (yyvsp[(2) - (3)].expr); } break; case 75: -#line 423 "xkbparse.y" +#line 422 "xkbparse.y" { (yyval.expr)= ExprCreateUnary(ExprActionList,TypeAction,(yyvsp[(2) - (3)].expr)); } break; case 76: -#line 427 "xkbparse.y" +#line 426 "xkbparse.y" { (yyval.groupCompat)= GroupCompatCreate((yyvsp[(2) - (5)].ival),(yyvsp[(4) - (5)].expr)); } break; case 77: -#line 431 "xkbparse.y" +#line 430 "xkbparse.y" { (yyval.modMask)= ModMapCreate((yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].expr)); } break; case 78: -#line 435 "xkbparse.y" +#line 434 "xkbparse.y" { (yyval.ledMap)= IndicatorMapCreate((yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].var)); } break; case 79: -#line 439 "xkbparse.y" +#line 438 "xkbparse.y" { (yyval.ledName)= IndicatorNameCreate((yyvsp[(2) - (5)].ival),(yyvsp[(4) - (5)].expr),False); } break; case 80: -#line 441 "xkbparse.y" +#line 440 "xkbparse.y" { (yyval.ledName)= IndicatorNameCreate((yyvsp[(3) - (6)].ival),(yyvsp[(5) - (6)].expr),True); } break; case 81: -#line 445 "xkbparse.y" +#line 444 "xkbparse.y" { (yyval.shape)= ShapeDeclCreate((yyvsp[(2) - (6)].sval),(OutlineDef *)&(yyvsp[(4) - (6)].outline)->common); } break; case 82: -#line 447 "xkbparse.y" +#line 446 "xkbparse.y" { OutlineDef *outlines; outlines= OutlineCreate(None,(yyvsp[(4) - (6)].expr)); @@ -2341,92 +2342,92 @@ yyreduce: break; case 83: -#line 455 "xkbparse.y" +#line 454 "xkbparse.y" { (yyval.section)= SectionDeclCreate((yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].row)); } break; case 84: -#line 459 "xkbparse.y" +#line 458 "xkbparse.y" { (yyval.row)=(RowDef *)AppendStmt(&(yyvsp[(1) - (2)].row)->common,&(yyvsp[(2) - (2)].row)->common);} break; case 85: -#line 461 "xkbparse.y" +#line 460 "xkbparse.y" { (yyval.row)= (yyvsp[(1) - (1)].row); } break; case 86: -#line 465 "xkbparse.y" +#line 464 "xkbparse.y" { (yyval.row)= RowDeclCreate((yyvsp[(3) - (5)].key)); } break; case 87: -#line 467 "xkbparse.y" +#line 466 "xkbparse.y" { (yyval.row)= (RowDef *)(yyvsp[(1) - (1)].var); } break; case 88: -#line 469 "xkbparse.y" +#line 468 "xkbparse.y" { (yyval.row)= (RowDef *)(yyvsp[(1) - (1)].doodad); } break; case 89: -#line 471 "xkbparse.y" +#line 470 "xkbparse.y" { (yyval.row)= (RowDef *)(yyvsp[(1) - (1)].ledMap); } break; case 90: -#line 473 "xkbparse.y" +#line 472 "xkbparse.y" { (yyval.row)= (RowDef *)(yyvsp[(1) - (1)].overlay); } break; case 91: -#line 477 "xkbparse.y" +#line 476 "xkbparse.y" { (yyval.key)=(KeyDef *)AppendStmt(&(yyvsp[(1) - (2)].key)->common,&(yyvsp[(2) - (2)].key)->common);} break; case 92: -#line 479 "xkbparse.y" +#line 478 "xkbparse.y" { (yyval.key)= (yyvsp[(1) - (1)].key); } break; case 93: -#line 483 "xkbparse.y" +#line 482 "xkbparse.y" { (yyval.key)= (yyvsp[(3) - (5)].key); } break; case 94: -#line 485 "xkbparse.y" +#line 484 "xkbparse.y" { (yyval.key)= (KeyDef *)(yyvsp[(1) - (1)].var); } break; case 95: -#line 489 "xkbparse.y" +#line 488 "xkbparse.y" { (yyval.key)=(KeyDef *)AppendStmt(&(yyvsp[(1) - (3)].key)->common,&(yyvsp[(3) - (3)].key)->common);} break; case 96: -#line 491 "xkbparse.y" +#line 490 "xkbparse.y" { (yyval.key)= (yyvsp[(1) - (1)].key); } break; case 97: -#line 495 "xkbparse.y" +#line 494 "xkbparse.y" { (yyval.key)= KeyDeclCreate((yyvsp[(1) - (1)].str),NULL); } break; case 98: -#line 497 "xkbparse.y" +#line 496 "xkbparse.y" { (yyval.key)= KeyDeclCreate(NULL,(yyvsp[(2) - (3)].expr)); } break; case 99: -#line 501 "xkbparse.y" +#line 500 "xkbparse.y" { (yyval.overlay)= OverlayDeclCreate((yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].olKey)); } break; case 100: -#line 505 "xkbparse.y" +#line 504 "xkbparse.y" { (yyval.olKey)= (OverlayKeyDef *) AppendStmt(&(yyvsp[(1) - (3)].olKey)->common,&(yyvsp[(3) - (3)].olKey)->common); @@ -2434,52 +2435,52 @@ yyreduce: break; case 101: -#line 510 "xkbparse.y" +#line 509 "xkbparse.y" { (yyval.olKey)= (yyvsp[(1) - (1)].olKey); } break; case 102: -#line 514 "xkbparse.y" +#line 513 "xkbparse.y" { (yyval.olKey)= OverlayKeyCreate((yyvsp[(1) - (3)].str),(yyvsp[(3) - (3)].str)); } break; case 103: -#line 518 "xkbparse.y" +#line 517 "xkbparse.y" { (yyval.outline)=(OutlineDef *)AppendStmt(&(yyvsp[(1) - (3)].outline)->common,&(yyvsp[(3) - (3)].outline)->common);} break; case 104: -#line 520 "xkbparse.y" +#line 519 "xkbparse.y" { (yyval.outline)= (yyvsp[(1) - (1)].outline); } break; case 105: -#line 524 "xkbparse.y" +#line 523 "xkbparse.y" { (yyval.outline)= OutlineCreate(None,(yyvsp[(2) - (3)].expr)); } break; case 106: -#line 526 "xkbparse.y" +#line 525 "xkbparse.y" { (yyval.outline)= OutlineCreate((yyvsp[(1) - (5)].sval),(yyvsp[(4) - (5)].expr)); } break; case 107: -#line 528 "xkbparse.y" +#line 527 "xkbparse.y" { (yyval.outline)= OutlineCreate((yyvsp[(1) - (3)].sval),(yyvsp[(3) - (3)].expr)); } break; case 108: -#line 532 "xkbparse.y" +#line 531 "xkbparse.y" { (yyval.expr)= (ExprDef *)AppendStmt(&(yyvsp[(1) - (3)].expr)->common,&(yyvsp[(3) - (3)].expr)->common); } break; case 109: -#line 534 "xkbparse.y" +#line 533 "xkbparse.y" { (yyval.expr)= (yyvsp[(1) - (1)].expr); } break; case 110: -#line 538 "xkbparse.y" +#line 537 "xkbparse.y" { ExprDef *expr; expr= ExprCreate(ExprCoord,TypeUnknown); @@ -2490,237 +2491,237 @@ yyreduce: break; case 111: -#line 548 "xkbparse.y" +#line 547 "xkbparse.y" { (yyval.doodad)= DoodadCreate((yyvsp[(1) - (6)].uval),(yyvsp[(2) - (6)].sval),(yyvsp[(4) - (6)].var)); } break; case 112: -#line 551 "xkbparse.y" +#line 550 "xkbparse.y" { (yyval.uval)= XkbTextDoodad; } break; case 113: -#line 552 "xkbparse.y" +#line 551 "xkbparse.y" { (yyval.uval)= XkbOutlineDoodad; } break; case 114: -#line 553 "xkbparse.y" +#line 552 "xkbparse.y" { (yyval.uval)= XkbSolidDoodad; } break; case 115: -#line 554 "xkbparse.y" +#line 553 "xkbparse.y" { (yyval.uval)= XkbLogoDoodad; } break; case 116: -#line 557 "xkbparse.y" +#line 556 "xkbparse.y" { (yyval.sval)= (yyvsp[(1) - (1)].sval); } break; case 117: -#line 558 "xkbparse.y" +#line 557 "xkbparse.y" { (yyval.sval)= (yyvsp[(1) - (1)].sval); } break; case 118: -#line 562 "xkbparse.y" +#line 561 "xkbparse.y" { (yyval.sval)= XkbInternAtom(NULL,"action",False); } break; case 119: -#line 564 "xkbparse.y" +#line 563 "xkbparse.y" { (yyval.sval)= XkbInternAtom(NULL,"interpret",False); } break; case 120: -#line 566 "xkbparse.y" +#line 565 "xkbparse.y" { (yyval.sval)= XkbInternAtom(NULL,"type",False); } break; case 121: -#line 568 "xkbparse.y" +#line 567 "xkbparse.y" { (yyval.sval)= XkbInternAtom(NULL,"key",False); } break; case 122: -#line 570 "xkbparse.y" +#line 569 "xkbparse.y" { (yyval.sval)= XkbInternAtom(NULL,"group",False); } break; case 123: -#line 572 "xkbparse.y" +#line 571 "xkbparse.y" {(yyval.sval)=XkbInternAtom(NULL,"modifier_map",False);} break; case 124: -#line 574 "xkbparse.y" +#line 573 "xkbparse.y" { (yyval.sval)= XkbInternAtom(NULL,"indicator",False); } break; case 125: -#line 576 "xkbparse.y" +#line 575 "xkbparse.y" { (yyval.sval)= XkbInternAtom(NULL,"shape",False); } break; case 126: -#line 578 "xkbparse.y" +#line 577 "xkbparse.y" { (yyval.sval)= XkbInternAtom(NULL,"row",False); } break; case 127: -#line 580 "xkbparse.y" +#line 579 "xkbparse.y" { (yyval.sval)= XkbInternAtom(NULL,"section",False); } break; case 128: -#line 582 "xkbparse.y" +#line 581 "xkbparse.y" { (yyval.sval)= XkbInternAtom(NULL,"text",False); } break; case 129: -#line 585 "xkbparse.y" +#line 584 "xkbparse.y" { (yyval.uval)= (yyvsp[(1) - (1)].uval); } break; case 130: -#line 586 "xkbparse.y" +#line 585 "xkbparse.y" { (yyval.uval)= MergeDefault; } break; case 131: -#line 589 "xkbparse.y" +#line 588 "xkbparse.y" { (yyval.uval)= MergeDefault; } break; case 132: -#line 590 "xkbparse.y" +#line 589 "xkbparse.y" { (yyval.uval)= MergeAugment; } break; case 133: -#line 591 "xkbparse.y" +#line 590 "xkbparse.y" { (yyval.uval)= MergeOverride; } break; case 134: -#line 592 "xkbparse.y" +#line 591 "xkbparse.y" { (yyval.uval)= MergeReplace; } break; case 135: -#line 593 "xkbparse.y" +#line 592 "xkbparse.y" { (yyval.uval)= MergeAltForm; } break; case 136: -#line 596 "xkbparse.y" +#line 595 "xkbparse.y" { (yyval.expr)= (yyvsp[(1) - (1)].expr); } break; case 137: -#line 597 "xkbparse.y" +#line 596 "xkbparse.y" { (yyval.expr)= NULL; } break; case 138: -#line 601 "xkbparse.y" +#line 600 "xkbparse.y" { (yyval.expr)= (ExprDef *)AppendStmt(&(yyvsp[(1) - (3)].expr)->common,&(yyvsp[(3) - (3)].expr)->common); } break; case 139: -#line 603 "xkbparse.y" +#line 602 "xkbparse.y" { (yyval.expr)= (yyvsp[(1) - (1)].expr); } break; case 140: -#line 607 "xkbparse.y" +#line 606 "xkbparse.y" { (yyval.expr)= ExprCreateBinary(OpDivide,(yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); } break; case 141: -#line 609 "xkbparse.y" +#line 608 "xkbparse.y" { (yyval.expr)= ExprCreateBinary(OpAdd,(yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); } break; case 142: -#line 611 "xkbparse.y" +#line 610 "xkbparse.y" { (yyval.expr)= ExprCreateBinary(OpSubtract,(yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); } break; case 143: -#line 613 "xkbparse.y" +#line 612 "xkbparse.y" { (yyval.expr)= ExprCreateBinary(OpMultiply,(yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); } break; case 144: -#line 615 "xkbparse.y" +#line 614 "xkbparse.y" { (yyval.expr)= ExprCreateBinary(OpAssign,(yyvsp[(1) - (3)].expr),(yyvsp[(3) - (3)].expr)); } break; case 145: -#line 617 "xkbparse.y" +#line 616 "xkbparse.y" { (yyval.expr)= (yyvsp[(1) - (1)].expr); } break; case 146: -#line 621 "xkbparse.y" +#line 620 "xkbparse.y" { (yyval.expr)= ExprCreateUnary(OpNegate,(yyvsp[(2) - (2)].expr)->type,(yyvsp[(2) - (2)].expr)); } break; case 147: -#line 623 "xkbparse.y" +#line 622 "xkbparse.y" { (yyval.expr)= ExprCreateUnary(OpUnaryPlus,(yyvsp[(2) - (2)].expr)->type,(yyvsp[(2) - (2)].expr)); } break; case 148: -#line 625 "xkbparse.y" +#line 624 "xkbparse.y" { (yyval.expr)= ExprCreateUnary(OpNot,TypeBoolean,(yyvsp[(2) - (2)].expr)); } break; case 149: -#line 627 "xkbparse.y" +#line 626 "xkbparse.y" { (yyval.expr)= ExprCreateUnary(OpInvert,(yyvsp[(2) - (2)].expr)->type,(yyvsp[(2) - (2)].expr)); } break; case 150: -#line 629 "xkbparse.y" +#line 628 "xkbparse.y" { (yyval.expr)= (yyvsp[(1) - (1)].expr); } break; case 151: -#line 631 "xkbparse.y" +#line 630 "xkbparse.y" { (yyval.expr)= ActionCreate((yyvsp[(1) - (4)].sval),(yyvsp[(3) - (4)].expr)); } break; case 152: -#line 633 "xkbparse.y" +#line 632 "xkbparse.y" { (yyval.expr)= (yyvsp[(1) - (1)].expr); } break; case 153: -#line 635 "xkbparse.y" +#line 634 "xkbparse.y" { (yyval.expr)= (yyvsp[(2) - (3)].expr); } break; case 154: -#line 639 "xkbparse.y" +#line 638 "xkbparse.y" { (yyval.expr)= (ExprDef *)AppendStmt(&(yyvsp[(1) - (3)].expr)->common,&(yyvsp[(3) - (3)].expr)->common); } break; case 155: -#line 641 "xkbparse.y" +#line 640 "xkbparse.y" { (yyval.expr)= (yyvsp[(1) - (1)].expr); } break; case 156: -#line 645 "xkbparse.y" +#line 644 "xkbparse.y" { (yyval.expr)= ActionCreate((yyvsp[(1) - (4)].sval),(yyvsp[(3) - (4)].expr)); } break; case 157: -#line 649 "xkbparse.y" +#line 648 "xkbparse.y" { ExprDef *expr; expr= ExprCreate(ExprIdent,TypeUnknown); @@ -2730,7 +2731,7 @@ yyreduce: break; case 158: -#line 656 "xkbparse.y" +#line 655 "xkbparse.y" { ExprDef *expr; expr= ExprCreate(ExprFieldRef,TypeUnknown); @@ -2741,7 +2742,7 @@ yyreduce: break; case 159: -#line 664 "xkbparse.y" +#line 663 "xkbparse.y" { ExprDef *expr; expr= ExprCreate(ExprArrayRef,TypeUnknown); @@ -2753,7 +2754,7 @@ yyreduce: break; case 160: -#line 673 "xkbparse.y" +#line 672 "xkbparse.y" { ExprDef *expr; expr= ExprCreate(ExprArrayRef,TypeUnknown); @@ -2765,7 +2766,7 @@ yyreduce: break; case 161: -#line 684 "xkbparse.y" +#line 683 "xkbparse.y" { ExprDef *expr; expr= ExprCreate(ExprValue,TypeString); @@ -2775,7 +2776,7 @@ yyreduce: break; case 162: -#line 691 "xkbparse.y" +#line 690 "xkbparse.y" { ExprDef *expr; expr= ExprCreate(ExprValue,TypeInt); @@ -2785,7 +2786,7 @@ yyreduce: break; case 163: -#line 698 "xkbparse.y" +#line 697 "xkbparse.y" { ExprDef *expr; expr= ExprCreate(ExprValue,TypeFloat); @@ -2795,7 +2796,7 @@ yyreduce: break; case 164: -#line 705 "xkbparse.y" +#line 704 "xkbparse.y" { ExprDef *expr; expr= ExprCreate(ExprValue,TypeKeyName); @@ -2807,35 +2808,36 @@ yyreduce: break; case 165: -#line 715 "xkbparse.y" +#line 714 "xkbparse.y" { (yyval.expr)= (yyvsp[(1) - (1)].expr); } break; case 166: -#line 716 "xkbparse.y" +#line 715 "xkbparse.y" { (yyval.expr)= NULL; } break; case 167: -#line 720 "xkbparse.y" +#line 719 "xkbparse.y" { (yyval.expr)= AppendKeysymList((yyvsp[(1) - (3)].expr),(KeySym)(yyvsp[(3) - (3)].uval)); } break; case 168: -#line 722 "xkbparse.y" +#line 721 "xkbparse.y" { (yyval.expr)= CreateKeysymList((KeySym)(yyvsp[(1) - (1)].uval)); } break; case 169: -#line 726 "xkbparse.y" +#line 725 "xkbparse.y" { KeySym sym; if (LookupKeysym(scanStr,&sym)) (yyval.uval)= sym; else { char buf[120]; - sprintf(buf,"expected keysym, got %s", - uStringText(scanStr)); + snprintf(buf, sizeof(buf), + "expected keysym, got %s", + uStringText(scanStr)); yyerror(buf); yynerrs++; (yyval.uval)= NoSymbol; @@ -2925,7 +2927,7 @@ yyreduce: /* Line 1267 of yacc.c. */ -#line 2929 "xkbparse.c" +#line 2931 "xkbparse.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); diff --git a/xkbcomp/xkbparse.y b/xkbcomp/xkbparse.y index 52afa2b80..63f87bb74 100644 --- a/xkbcomp/xkbparse.y +++ b/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 @@ -729,8 +728,9 @@ KeySym : IDENT $$= sym; else { char buf[120]; - sprintf(buf,"expected keysym, got %s", - uStringText(scanStr)); + snprintf(buf, sizeof(buf), + "expected keysym, got %s", + uStringText(scanStr)); yyerror(buf); yynerrs++; $$= NoSymbol; diff --git a/xkbcomp/xkbpath.c b/xkbcomp/xkbpath.c index 0a7329c8e..68020129e 100644 --- a/xkbcomp/xkbpath.c +++ b/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/xkbcomp/xkbpath.h b/xkbcomp/xkbpath.h index 75c137d0c..66c3ab76b 100644 --- a/xkbcomp/xkbpath.h +++ b/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/xkbcomp/xkbscan.c b/xkbcomp/xkbscan.c index ef2227d79..31cafd4ab 100644 --- a/xkbcomp/xkbscan.c +++ b/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,329 @@ #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; + +char *scanStr = NULL; +static int scanStrLine = 0; #define BUFSIZE 512 -static int nInBuf = 0; -static char buf[BUFSIZE]; +static int nInBuf = 0; +static char buf[BUFSIZE]; #ifdef DEBUG - -extern unsigned debugFlags; - static char * tokText(int tok) { -static char buf[32]; - - switch (tok) { - case END_OF_FILE: sprintf(buf, "END_OF_FILE");break; - case ERROR_TOK: sprintf(buf, "ERROR"); break; - - case XKB_KEYMAP: sprintf(buf, "XKB_KEYMAP"); break; - case XKB_KEYCODES: sprintf(buf, "XKB_KEYCODES"); break; - case XKB_TYPES: sprintf(buf, "XKB_TYPES"); break; - case XKB_SYMBOLS: sprintf(buf, "XKB_SYMBOLS"); break; - case XKB_COMPATMAP: sprintf(buf, "XKB_COMPATMAP"); break; - case XKB_GEOMETRY: sprintf(buf, "XKB_GEOMETRY"); break; - case XKB_SEMANTICS: sprintf(buf, "XKB_SEMANTICS"); break; - case XKB_LAYOUT: sprintf(buf, "XKB_LAYOUT"); break; - - case INCLUDE: sprintf(buf, "INCLUDE"); break; - case OVERRIDE: sprintf(buf, "OVERRIDE"); break; - case AUGMENT: sprintf(buf, "AUGMENT"); break; - case REPLACE: sprintf(buf, "REPLACE"); break; - case ALTERNATE: sprintf(buf, "ALTERNATE"); break; - - case VIRTUAL_MODS: sprintf(buf, "VIRTUAL_MODS"); break; - case TYPE: sprintf(buf, "TYPE"); break; - case INTERPRET: sprintf(buf, "INTERPRET"); break; - case ACTION_TOK: sprintf(buf, "ACTION"); break; - case KEY: sprintf(buf, "KEY"); break; - case ALIAS: sprintf(buf, "ALIAS"); break; - case GROUP: sprintf(buf, "GROUP"); break; - case MODIFIER_MAP: sprintf(buf, "MODIFIER_MAP"); break; - case INDICATOR: sprintf(buf, "INDICATOR"); break; - case SHAPE: sprintf(buf, "SHAPE"); break; - case KEYS: sprintf(buf, "KEYS"); break; - case ROW: sprintf(buf, "ROW"); break; - case SECTION: sprintf(buf, "SECTION"); break; - case OVERLAY: sprintf(buf, "OVERLAY"); break; - case TEXT: sprintf(buf, "TEXT"); break; - case OUTLINE: sprintf(buf, "OUTLINE"); break; - case SOLID: sprintf(buf, "SOLID"); break; - case LOGO: sprintf(buf, "LOGO"); break; - case VIRTUAL: sprintf(buf, "VIRTUAL"); break; - - case EQUALS: sprintf(buf, "EQUALS"); break; - case PLUS: sprintf(buf, "PLUS"); break; - case MINUS: sprintf(buf, "MINUS"); break; - case DIVIDE: sprintf(buf, "DIVIDE"); break; - case TIMES: sprintf(buf, "TIMES"); break; - case OBRACE: sprintf(buf, "OBRACE"); break; - case CBRACE: sprintf(buf, "CBRACE"); break; - case OPAREN: sprintf(buf, "OPAREN"); break; - case CPAREN: sprintf(buf, "CPAREN"); break; - case OBRACKET: sprintf(buf, "OBRACKET");break; - case CBRACKET: sprintf(buf, "CBRACKET");break; - case DOT: sprintf(buf, "DOT"); break; - case COMMA: sprintf(buf, "COMMA"); break; - case SEMI: sprintf(buf, "SEMI"); break; - case EXCLAM: sprintf(buf, "EXCLAM"); break; - case INVERT: sprintf(buf, "INVERT"); break; - - case STRING: sprintf(buf, "STRING (%s)",scanStr); break; - case INTEGER: sprintf(buf, "INTEGER (0x%x)",scanInt); break; - case FLOAT: sprintf(buf, "FLOAT (%d.%d)", - scanInt/XkbGeomPtsPerMM, - scanInt%XkbGeomPtsPerMM);break; - case IDENT: sprintf(buf, "IDENT (%s)",scanStr); break; - case KEYNAME: sprintf(buf, "KEYNAME (%s)",scanStr); break; - - case PARTIAL: sprintf(buf, "PARTIAL"); break; - case DEFAULT: sprintf(buf, "DEFAULT"); break; - case HIDDEN: sprintf(buf, "HIDDEN"); break; - - case ALPHANUMERIC_KEYS: sprintf(buf, "ALPHANUMERIC_KEYS"); break; - case MODIFIER_KEYS: sprintf(buf, "MODIFIER_KEYS"); break; - case KEYPAD_KEYS: sprintf(buf, "KEYPAD_KEYS"); break; - case FUNCTION_KEYS: sprintf(buf, "FUNCTION_KEYS"); break; - case ALTERNATE_GROUP: sprintf(buf, "ALTERNATE_GROUP"); break; - - default: sprintf(buf, "UNKNOWN"); break; + 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)", scanStr); + 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)", scanStr); + break; + case KEYNAME: + snprintf(buf, sizeof(buf), "KEYNAME (%s)", scanStr); + 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 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; + 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; + while (((ch = getc(yyin)) != EOF) && (ch != '"')) + { + if (ch == '\\') + { + if ((ch = getc(yyin)) != EOF) + { + if (ch == 'n') + ch = '\n'; + else if (ch == 't') + ch = '\t'; + else if (ch == 'v') + ch = '\v'; + else if (ch == 'b') + ch = '\b'; + else if (ch == 'r') + ch = '\r'; + else if (ch == 'f') + ch = '\f'; + else if (ch == 'e') + ch = '\033'; + else if (ch == '0') + { + int tmp, stop; + ch = stop = 0; + if (((tmp = getc(yyin)) != EOF) && (isdigit(tmp)) + && (tmp != '8') && (tmp != '9')) + { + ch = (ch * 8) + (tmp - '0'); + } + else + { + stop = 1; + ungetc(tmp, yyin); + } + if (!stop) + { + if (((tmp = getc(yyin)) != EOF) + && (isdigit(tmp)) && (tmp != '8') && (tmp != '9')) + { + ch = (ch * 8) + (tmp - '0'); + } + else + { + stop = 1; + ungetc(tmp, yyin); + } + } + if (!stop) + { + if (((tmp = getc(yyin)) != EOF) + && (isdigit(tmp)) && (tmp != '8') && (tmp != '9')) + { + ch = (ch * 8) + (tmp - '0'); + } + else + { + stop = 1; + ungetc(tmp, yyin); + } + } + } + } + else + return ERROR_TOK; + } + if (nInBuf < BUFSIZE - 1) + buf[nInBuf++] = ch; } - if ( ch == '"' ) { - buf[nInBuf++] = '\0'; - if ( scanStr ) - uFree( scanStr ); - scanStr = (char *)uStringDup(buf); - scanStrLine = lineNum; - return STRING; + if (ch == '"') + { + buf[nInBuf++] = '\0'; + if (scanStr) + uFree(scanStr); + scanStr = (char *) uStringDup(buf); + scanStrLine = lineNum; + return STRING; } return ERROR_TOK; } @@ -221,149 +365,220 @@ int ch; static int yyGetKeyName(void) { -int ch; + 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; + while (((ch = getc(yyin)) != EOF) && (ch != '>')) + { + if (ch == '\\') + { + if ((ch = getc(yyin)) != EOF) + { + if (ch == 'n') + ch = '\n'; + else if (ch == 't') + ch = '\t'; + else if (ch == 'v') + ch = '\v'; + else if (ch == 'b') + ch = '\b'; + else if (ch == 'r') + ch = '\r'; + else if (ch == 'f') + ch = '\f'; + else if (ch == 'e') + ch = '\033'; + else if (ch == '0') + { + int tmp, stop; + ch = stop = 0; + if (((tmp = getc(yyin)) != EOF) && (isdigit(tmp)) + && (tmp != '8') && (tmp != '9')) + { + ch = (ch * 8) + (tmp - '0'); + } + else + { + stop = 1; + ungetc(tmp, yyin); + } + if ((!stop) && ((tmp = getc(yyin)) != EOF) + && (isdigit(tmp)) && (tmp != '8') && (tmp != '9')) + { + ch = (ch * 8) + (tmp - '0'); + } + else + { + stop = 1; + ungetc(tmp, yyin); + } + if ((!stop) && ((tmp = getc(yyin)) != EOF) + && (isdigit(tmp)) && (tmp != '8') && (tmp != '9')) + { + ch = (ch * 8) + (tmp - '0'); + } + else + { + stop = 1; + ungetc(tmp, yyin); + } + } + } + else + return ERROR_TOK; + } + + if (nInBuf < BUFSIZE - 1) + buf[nInBuf++] = ch; } - if (( ch == '>' )&&(nInBuf<5)) { - buf[nInBuf++] = '\0'; - if ( scanStr ) - uFree( scanStr ); - scanStr = (char *)uStringDup(buf); - scanStrLine = lineNum; - return KEYNAME; + if ((ch == '>') && (nInBuf < 5)) + { + buf[nInBuf++] = '\0'; + if (scanStr) + uFree(scanStr); + scanStr = (char *) uStringDup(buf); + scanStrLine = lineNum; + return KEYNAME; } return ERROR_TOK; } -struct _Keyword { - const char *keyword; - int token; -} keywords[] = { - { "xkb_keymap", XKB_KEYMAP }, - { "xkb_keycodes", XKB_KEYCODES }, - { "xkb_types", XKB_TYPES }, - { "xkb_symbols", XKB_SYMBOLS }, - { "xkb_compat", XKB_COMPATMAP }, - { "xkb_compat_map", XKB_COMPATMAP }, - { "xkb_compatibility", XKB_COMPATMAP }, - { "xkb_compatibility_map", XKB_COMPATMAP }, - { "xkb_geometry", XKB_GEOMETRY }, - { "xkb_semantics", XKB_SEMANTICS }, - { "xkb_layout", XKB_LAYOUT }, - { "include", INCLUDE }, - { "override", OVERRIDE }, - { "augment", AUGMENT }, - { "replace", REPLACE }, - { "alternate", ALTERNATE }, - { "partial", PARTIAL }, - { "default", DEFAULT }, - { "hidden", HIDDEN }, - { "virtual_modifiers", VIRTUAL_MODS }, - { "type", TYPE }, - { "interpret", INTERPRET }, - { "action", ACTION_TOK }, - { "key", KEY }, - { "alias", ALIAS }, - { "group", GROUP }, - { "modmap", MODIFIER_MAP }, - { "mod_map", MODIFIER_MAP }, - { "modifier_map", MODIFIER_MAP }, - { "indicator", INDICATOR }, - { "shape", SHAPE }, - { "row", ROW }, - { "keys", KEYS }, - { "section", SECTION }, - { "overlay", OVERLAY }, - { "text", TEXT }, - { "outline", OUTLINE }, - { "solid", SOLID }, - { "logo", LOGO }, - { "virtual", VIRTUAL }, - { "alphanumeric_keys", ALPHANUMERIC_KEYS }, - { "modifier_keys", MODIFIER_KEYS }, - { "keypad_keys", KEYPAD_KEYS }, - { "function_keys", FUNCTION_KEYS }, - { "alternate_group", ALTERNATE_GROUP } +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, found; + int rtrn = IDENT; + + buf[0] = first; + nInBuf = 1; + while (((ch = getc(yyin)) != EOF) && (isalnum(ch) || (ch == '_'))) + { + if (nInBuf < BUFSIZE - 1) + buf[nInBuf++] = ch; } buf[nInBuf++] = '\0'; - found= 0; - - for (i=0;(!found)&&(i<numKeywords);i++) { - if (uStrCaseCmp(buf,keywords[i].keyword)==0) { - rtrn= keywords[i].token; - found= 1; - } + found = 0; + + for (i = 0; (!found) && (i < numKeywords); i++) + { + if (uStrCaseCmp(buf, keywords[i].keyword) == 0) + { + rtrn = keywords[i].token; + found = 1; + } } - if (!found) { - if ( scanStr ) - uFree( scanStr ); - scanStr = (char *)uStringDup(buf); - scanStrLine = lineNum; - rtrn = IDENT; + if (!found) + { + if (scanStr) + uFree(scanStr); + scanStr = (char *) uStringDup(buf); + scanStrLine = lineNum; + rtrn = IDENT; } - if ( (ch!=EOF) && (!isspace(ch)) ) - ungetc( ch, yyin ); - else if ( ch=='\n' ) - lineNum++; + if ((ch != EOF) && (!isspace(ch))) + ungetc(ch, yyin); + else if (ch == '\n') + lineNum++; return rtrn; } @@ -371,98 +586,138 @@ 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; + + buf[0] = ch; + nInBuf = 1; + while (((ch = getc(yyin)) != EOF) + && (isxdigit(ch) || ((nInBuf == 1) && (ch == 'x')))) + { + buf[nInBuf++] = ch; } - if (ch=='.') { - isFloat= 1; - buf[nInBuf++]= ch; - while (((ch=getc(yyin))!=EOF)&&(isxdigit(ch))) { - buf[nInBuf++]= ch; - } + if (ch == '.') + { + isFloat = 1; + buf[nInBuf++] = ch; + while (((ch = getc(yyin)) != EOF) && (isxdigit(ch))) + { + buf[nInBuf++] = ch; + } } - buf[nInBuf++]= '\0'; - if ((ch!=EOF)&&(!isspace(ch))) - ungetc( ch, yyin ); - - if (isFloat) { - float tmp; - if (sscanf(buf,"%g",&tmp)==1) { - scanInt= tmp*XkbGeomPtsPerMM; - return FLOAT; - } + buf[nInBuf++] = '\0'; + if ((ch != EOF) && (!isspace(ch))) + ungetc(ch, yyin); + + if (isFloat) + { + float tmp; + if (sscanf(buf, "%g", &tmp) == 1) + { + scanInt = tmp * XkbGeomPtsPerMM; + return FLOAT; + } } - else if ( sscanf(buf,"%i",&scanInt)==1 ) - return INTEGER; - fprintf(stderr,"Malformed number %s\n",buf); + 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 = getc(yyin); + if (ch == '\n') + { + lineNum++; + } + else if (ch == '#') + { /* handle shell style '#' comments */ + do + { + ch = getc(yyin); + } + while ((ch != '\n') && (ch != EOF)); + lineNum++; + } + else if (ch == '/') + { /* handle C++ style double-/ comments */ + int newch = getc(yyin); + if (newch == '/') + { + do + { + ch = getc(yyin); + } + while ((ch != '\n') && (ch != EOF)); + lineNum++; + } + else if (newch != EOF) + { + ungetc(newch, yyin); + } + } + } + while ((ch != EOF) && (isspace(ch))); + if (ch == '=') + rtrn = EQUALS; + else if (ch == '+') + rtrn = PLUS; + else if (ch == '-') + rtrn = MINUS; + else if (ch == '/') + rtrn = DIVIDE; + else if (ch == '*') + rtrn = TIMES; + else if (ch == '{') + rtrn = OBRACE; + else if (ch == '}') + rtrn = CBRACE; + else if (ch == '(') + rtrn = OPAREN; + else if (ch == ')') + rtrn = CPAREN; + else if (ch == '[') + rtrn = OBRACKET; + else if (ch == ']') + rtrn = CBRACKET; + else if (ch == '.') + rtrn = DOT; + else if (ch == ',') + rtrn = COMMA; + else if (ch == ';') + rtrn = SEMI; + else if (ch == '!') + rtrn = EXCLAM; + else if (ch == '~') + rtrn = INVERT; + else if (ch == '"') + rtrn = yyGetString(); + else if (ch == '<') + rtrn = yyGetKeyName(); + else if (isalpha(ch) || (ch == '_')) + rtrn = yyGetIdent(ch); + else if (isdigit(ch)) + rtrn = yyGetNumber(ch); + else if (ch == EOF) + rtrn = END_OF_FILE; + else + { #ifdef DEBUG - if (debugFlags) - fprintf(stderr,"Unexpected character %c (%d) in input stream\n",ch,ch); + 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; } |