Borrow atom implementation from libxkbfile
We need an atom implementation not relying on XInternAtom and friends. The original code is in libxkbfile/src/xkbatom.cmaster
parent
46faf56ded
commit
c88c0ba725
|
@ -146,4 +146,13 @@ XkbcFreeGeometry(XkbGeometryPtr geom, unsigned which, Bool freeMap);
|
|||
extern int
|
||||
XkbcAllocGeometry(XkbcDescPtr xkb, XkbGeometrySizesPtr sizes);
|
||||
|
||||
extern void
|
||||
XkbcInitAtoms(void);
|
||||
|
||||
extern char *
|
||||
XkbcAtomGetString(Atom atom);
|
||||
|
||||
extern Atom
|
||||
XkbcInternAtom(char *name, Bool onlyIfExists);
|
||||
|
||||
#endif /* _XKBCOMMON_H_ */
|
||||
|
|
|
@ -18,4 +18,5 @@ libxkbcommon_la_SOURCES = \
|
|||
ks_tables.h \
|
||||
alloc.c \
|
||||
galloc.c \
|
||||
atom.c \
|
||||
keysym.c
|
||||
|
|
|
@ -0,0 +1,207 @@
|
|||
/***********************************************************
|
||||
Copyright 1987, 1998 The Open Group
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name of The Open Group shall not be
|
||||
used in advertising or otherwise to promote the sale, use or other dealings
|
||||
in this Software without prior written authorization from The Open Group.
|
||||
|
||||
|
||||
Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the name of Digital not be
|
||||
used in advertising or publicity pertaining to distribution of the
|
||||
software without specific, written prior permission.
|
||||
|
||||
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
SOFTWARE.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
/************************************************************
|
||||
Copyright 1994 by Silicon Graphics Computer Systems, Inc.
|
||||
|
||||
Permission to use, copy, modify, and distribute this
|
||||
software and its documentation for any purpose and without
|
||||
fee is hereby granted, provided that the above copyright
|
||||
notice appear in all copies and that both that copyright
|
||||
notice and this permission notice appear in supporting
|
||||
documentation, and that the name of Silicon Graphics not be
|
||||
used in advertising or publicity pertaining to distribution
|
||||
of the software without specific prior written permission.
|
||||
Silicon Graphics makes no representation about the suitability
|
||||
of this software for any purpose. It is provided "as is"
|
||||
without any express or implied warranty.
|
||||
|
||||
SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
|
||||
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
|
||||
GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
|
||||
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
|
||||
THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
********************************************************/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
#include "X11/extensions/XKBcommon.h"
|
||||
#include "XKBcommonint.h"
|
||||
|
||||
#define InitialTableSize 100
|
||||
|
||||
typedef struct _Node {
|
||||
struct _Node *left, *right;
|
||||
Atom a;
|
||||
unsigned int fingerPrint;
|
||||
char *string;
|
||||
} NodeRec, *NodePtr;
|
||||
|
||||
#define BAD_RESOURCE 0xe0000000
|
||||
|
||||
static Atom lastAtom = None;
|
||||
static NodePtr atomRoot = (NodePtr)NULL;
|
||||
static unsigned long tableLength;
|
||||
static NodePtr *nodeTable;
|
||||
|
||||
static void
|
||||
_XkbInitAtoms(void)
|
||||
{
|
||||
tableLength = InitialTableSize;
|
||||
nodeTable = (NodePtr *)_XkbAlloc(InitialTableSize*sizeof(NodePtr));
|
||||
nodeTable[None] = (NodePtr)NULL;
|
||||
}
|
||||
|
||||
void
|
||||
XkbcInitAtoms(void)
|
||||
{
|
||||
static int been_here= 0;
|
||||
if (!been_here) {
|
||||
_XkbInitAtoms();
|
||||
been_here= 1;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
static char *
|
||||
_XkbNameForAtom(Atom atom)
|
||||
{
|
||||
NodePtr node;
|
||||
if (atom > lastAtom) return NULL;
|
||||
if ((node = nodeTable[atom]) == (NodePtr)NULL) return NULL;
|
||||
return strdup(node->string);
|
||||
}
|
||||
|
||||
char *
|
||||
XkbcAtomGetString(Atom atm)
|
||||
{
|
||||
if (atm==None)
|
||||
return NULL;
|
||||
return _XkbNameForAtom(atm);
|
||||
}
|
||||
|
||||
static Atom
|
||||
_XkbMakeAtom(char *string,unsigned len,Bool makeit)
|
||||
{
|
||||
register NodePtr * np;
|
||||
unsigned i;
|
||||
int comp;
|
||||
register unsigned int fp = 0;
|
||||
|
||||
np = &atomRoot;
|
||||
for (i = 0; i < (len+1)/2; i++)
|
||||
{
|
||||
fp = fp * 27 + string[i];
|
||||
fp = fp * 27 + string[len - 1 - i];
|
||||
}
|
||||
while (*np != (NodePtr) NULL)
|
||||
{
|
||||
if (fp < (*np)->fingerPrint)
|
||||
np = &((*np)->left);
|
||||
else if (fp > (*np)->fingerPrint)
|
||||
np = &((*np)->right);
|
||||
else
|
||||
{ /* now start testing the strings */
|
||||
comp = strncmp(string, (*np)->string, (int)len);
|
||||
if ((comp < 0) || ((comp == 0) && (len < strlen((*np)->string))))
|
||||
np = &((*np)->left);
|
||||
else if (comp > 0)
|
||||
np = &((*np)->right);
|
||||
else
|
||||
return(*np)->a;
|
||||
}
|
||||
}
|
||||
if (makeit)
|
||||
{
|
||||
register NodePtr nd;
|
||||
|
||||
nd = (NodePtr) _XkbAlloc(sizeof(NodeRec));
|
||||
if (!nd)
|
||||
return BAD_RESOURCE;
|
||||
nd->string = (char *) _XkbAlloc(len + 1);
|
||||
if (!nd->string) {
|
||||
_XkbFree(nd);
|
||||
return BAD_RESOURCE;
|
||||
}
|
||||
strncpy(nd->string, string, (int)len);
|
||||
nd->string[len] = 0;
|
||||
if ((lastAtom + 1) >= tableLength) {
|
||||
NodePtr *table;
|
||||
|
||||
table = (NodePtr *) _XkbRealloc(nodeTable,
|
||||
tableLength * (2 * sizeof(NodePtr)));
|
||||
if (!table) {
|
||||
if (nd->string != string)
|
||||
_XkbFree(nd->string);
|
||||
_XkbFree(nd);
|
||||
return BAD_RESOURCE;
|
||||
}
|
||||
tableLength <<= 1;
|
||||
nodeTable = table;
|
||||
}
|
||||
*np = nd;
|
||||
nd->left = nd->right = (NodePtr) NULL;
|
||||
nd->fingerPrint = fp;
|
||||
nd->a = (++lastAtom);
|
||||
*(nodeTable+lastAtom) = nd;
|
||||
return nd->a;
|
||||
}
|
||||
else
|
||||
return None;
|
||||
}
|
||||
|
||||
Atom
|
||||
XkbcInternAtom(char *name,Bool onlyIfExists)
|
||||
{
|
||||
if (name==NULL)
|
||||
return None;
|
||||
return _XkbMakeAtom(name, strlen(name), (!onlyIfExists));
|
||||
}
|
Loading…
Reference in New Issue