From 240a0c3409f2cd81394188175499087c37793a55 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Tue, 15 Jun 2010 19:38:16 +0100 Subject: [PATCH] xkbcomp: Lazy keysym parsing (avoid XStringToKeysym) Instead of calling XStringToKeysym on every keysym we parse, store it as a string until we need to store it in an actual keymap. Signed-off-by: Daniel Stone --- configure.ac | 1 + src/Makefile.am | 4 ++-- src/xkbcomp/parseutils.c | 10 +++++----- src/xkbcomp/parseutils.h | 4 ++-- src/xkbcomp/symbols.c | 9 +++++++-- src/xkbcomp/xkbcomp.h | 2 +- src/xkbcomp/xkbparse.y | 43 +++++++++++++++++-------------------------- 7 files changed, 35 insertions(+), 38 deletions(-) diff --git a/configure.ac b/configure.ac index 5f298ce..5a70315 100644 --- a/configure.ac +++ b/configure.ac @@ -59,6 +59,7 @@ XORG_CHECK_MALLOC_ZERO XORG_CWARNFLAGS PKG_CHECK_MODULES([X11], [xproto kbproto >= 1.0.99.1]) +PKG_CHECK_MODULES([XLIB], [x11]) dnl Ensure we have keysym headers AC_MSG_CHECKING([for X11 includedir]) diff --git a/src/Makefile.am b/src/Makefile.am index 0159a6d..916858f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,10 +1,10 @@ SUBDIRS = makekeys xkbcomp -INCLUDES = -I$(top_srcdir)/include -I$(builddir)/makekeys +INCLUDES = -I$(top_srcdir)/include -I$(builddir)/makekeys $(XLIB_CFLAGS) AM_CFLAGS = $(X11_CFLAGS) $(CWARNFLAGS) $(XMALLOC_ZERO_CFLAGS) lib_LTLIBRARIES = libxkbcommon.la -libxkbcommon_la_LIBADD = xkbcomp/libxkbcomp.la +libxkbcommon_la_LIBADD = xkbcomp/libxkbcomp.la $(XLIB_LIBS) libxkbcommon_la_SOURCES = \ XKBcommonint.h \ alloc.c \ diff --git a/src/xkbcomp/parseutils.c b/src/xkbcomp/parseutils.c index ed66263..9f6c0e4 100644 --- a/src/xkbcomp/parseutils.c +++ b/src/xkbcomp/parseutils.c @@ -393,7 +393,7 @@ ActionCreate(Atom name, ExprDef * args) } ExprDef * -CreateKeysymList(KeySym sym) +CreateKeysymList(char *sym) { ExprDef *def; @@ -401,8 +401,8 @@ CreateKeysymList(KeySym sym) if (def) { def->value.list.nSyms = 1; - def->value.list.szSyms = 2; - def->value.list.syms = uTypedCalloc(2, KeySym); + def->value.list.szSyms = 4; + def->value.list.syms = uTypedCalloc(4, char *); if (def->value.list.syms != NULL) { def->value.list.syms[0] = sym; @@ -601,7 +601,7 @@ DoodadCreate(unsigned type, Atom name, VarDef * body) } ExprDef * -AppendKeysymList(ExprDef * list, KeySym sym) +AppendKeysymList(ExprDef * list, char *sym) { if (list->value.list.nSyms >= list->value.list.szSyms) { @@ -609,7 +609,7 @@ AppendKeysymList(ExprDef * list, KeySym sym) list->value.list.syms = uTypedRecalloc(list->value.list.syms, list->value.list.nSyms, list->value.list.szSyms, - KeySym); + char *); if (list->value.list.syms == NULL) { FATAL("Couldn't resize list of symbols for append\n"); diff --git a/src/xkbcomp/parseutils.h b/src/xkbcomp/parseutils.h index 5e8f55b..ea04240 100644 --- a/src/xkbcomp/parseutils.h +++ b/src/xkbcomp/parseutils.h @@ -121,7 +121,7 @@ extern ExprDef *ActionCreate(Atom /* name */ , ExprDef * /* args */ ); -extern ExprDef *CreateKeysymList(KeySym /* sym */ +extern ExprDef *CreateKeysymList(char * /* sym */ ); extern ShapeDef *ShapeDeclCreate(Atom /* name */ , @@ -161,7 +161,7 @@ extern DoodadDef *DoodadCreate(unsigned /* type */ , ); extern ExprDef *AppendKeysymList(ExprDef * /* list */ , - KeySym /* sym */ + char * /* sym */ ); extern int LookupKeysym(char * /* str */ , diff --git a/src/xkbcomp/symbols.c b/src/xkbcomp/symbols.c index efc6555..ce97a6f 100644 --- a/src/xkbcomp/symbols.c +++ b/src/xkbcomp/symbols.c @@ -29,6 +29,7 @@ #include "xkbmisc.h" #include "tokens.h" #include "expr.h" +#include "parseutils.h" #include #include @@ -969,8 +970,12 @@ AddSymbolsToKey(KeyInfo * key, return False; } key->symsDefined |= (1 << ndx); - memcpy((char *) key->syms[ndx], (char *) value->value.list.syms, - nSyms * sizeof(KeySym)); + for (i = 0; i < nSyms; i++) { + if (!LookupKeysym(value->value.list.syms[i], &key->syms[ndx][i])) { + WSGO("Could not resolve keysym %s\n", value->value.list.syms[i]); + key->syms[ndx][i] = NoSymbol; + } + } for (i = key->numLevels[ndx] - 1; (i >= 0) && (key->syms[ndx][i] == NoSymbol); i--) { diff --git a/src/xkbcomp/xkbcomp.h b/src/xkbcomp/xkbcomp.h index d3a64b9..c120e24 100644 --- a/src/xkbcomp/xkbcomp.h +++ b/src/xkbcomp/xkbcomp.h @@ -158,7 +158,7 @@ typedef struct _Expr { int nSyms; int szSyms; - KeySym *syms; + char **syms; } list; struct { diff --git a/src/xkbcomp/xkbparse.y b/src/xkbcomp/xkbparse.y index f95dec9..68e261f 100644 --- a/src/xkbcomp/xkbparse.y +++ b/src/xkbcomp/xkbparse.y @@ -95,6 +95,7 @@ #define DEBUG_VAR parseDebug #include "parseutils.h" #include "xkbmisc.h" +#include #include #include #include @@ -137,9 +138,9 @@ unsigned int parseDebug; XkbFile *file; } %type Number Integer Float SignedNumber -%type XkbCompositeType FileType MergeMode OptMergeMode KeySym +%type XkbCompositeType FileType MergeMode OptMergeMode %type DoodadType Flag Flags OptFlags -%type KeyName MapName OptMapName +%type KeyName MapName OptMapName KeySym %type FieldSpec Ident Element String %type DeclList Decl %type OptExprList ExprList Expr Term Lhs Terminal ArrayInit @@ -375,9 +376,9 @@ InterpretDecl : INTERPRET InterpretMatch OBRACE ; InterpretMatch : KeySym PLUS Expr - { $$= InterpCreate((KeySym)$1,$3); } + { $$= InterpCreate(XStringToKeysym($1), $3); } | KeySym - { $$= InterpCreate((KeySym)$1,NULL); } + { $$= InterpCreate(XStringToKeysym($1), NULL); } ; VarDeclList : VarDeclList VarDecl @@ -717,35 +718,25 @@ OptKeySymList : KeySymList { $$= $1; } ; KeySymList : KeySymList COMMA KeySym - { $$= AppendKeysymList($1,(KeySym)$3); } + { $$= AppendKeysymList($1,$3); } | KeySym - { $$= CreateKeysymList((KeySym)$1); } + { $$= CreateKeysymList($1); } ; -KeySym : IDENT +KeySym : IDENT { $$= scanStr; scanStr= NULL; } + | SECTION { $$= strdup("section"); } + | Integer { - KeySym sym; - if (LookupKeysym(scanStr,&sym)) - $$= sym; + if ($1 < 10) { /* XK_0 .. XK_9 */ + $$= malloc(2); + $$[0]= $1 + '0'; + $$[1]= '\0'; + } else { - char buf[120]; - snprintf(buf, sizeof(buf), - "expected keysym, got %s", - uStringText(scanStr)); - yyerror(buf); - yynerrs++; - $$= NoSymbol; + $$= malloc(17); + snprintf($$, 17, "%x", $1); } } - | SECTION - { - $$= XK_section; - } - | Integer - { - if ($1<10) $$= $1+'0'; /* XK_0 .. XK_9 */ - else $$= $1; - } ; SignedNumber : MINUS Number { $$= -$2; } -- 2.7.4