2009-03-25 20:00:49 -06:00
|
|
|
/***********************************************************
|
|
|
|
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
|
2009-04-08 08:46:25 -06:00
|
|
|
#include "xkbmisc.h"
|
2009-03-25 20:00:49 -06:00
|
|
|
#include "X11/extensions/XKBcommon.h"
|
|
|
|
#include "XKBcommonint.h"
|
|
|
|
|
|
|
|
#define InitialTableSize 100
|
|
|
|
|
|
|
|
typedef struct _Node {
|
2009-03-25 20:17:33 -06:00
|
|
|
struct _Node *left, *right;
|
2010-06-28 04:50:12 -06:00
|
|
|
uint32_t a;
|
2009-03-25 20:17:33 -06:00
|
|
|
unsigned int fingerPrint;
|
|
|
|
char *string;
|
2009-03-25 20:00:49 -06:00
|
|
|
} NodeRec, *NodePtr;
|
|
|
|
|
|
|
|
#define BAD_RESOURCE 0xe0000000
|
|
|
|
|
2010-06-28 04:50:12 -06:00
|
|
|
static uint32_t lastAtom = None;
|
2009-03-25 20:17:33 -06:00
|
|
|
static NodePtr atomRoot = NULL;
|
2009-03-25 20:00:49 -06:00
|
|
|
static unsigned long tableLength;
|
2009-03-25 20:17:33 -06:00
|
|
|
static NodePtr *nodeTable = NULL;
|
2010-06-21 07:22:26 -06:00
|
|
|
InternAtomFuncPtr do_intern_atom = NULL;
|
|
|
|
GetAtomValueFuncPtr do_get_atom_value = NULL;
|
2009-03-25 20:00:49 -06:00
|
|
|
|
|
|
|
void
|
2010-06-21 07:22:26 -06:00
|
|
|
XkbcInitAtoms(InternAtomFuncPtr intern, GetAtomValueFuncPtr get_atom_value)
|
2009-03-25 20:00:49 -06:00
|
|
|
{
|
2010-06-21 07:22:26 -06:00
|
|
|
if (intern && get_atom_value) {
|
|
|
|
if (do_intern_atom && do_get_atom_value)
|
|
|
|
return;
|
|
|
|
do_intern_atom = intern;
|
|
|
|
do_get_atom_value = get_atom_value;
|
|
|
|
return;
|
|
|
|
}
|
2009-03-25 20:00:49 -06:00
|
|
|
}
|
|
|
|
|
2010-06-30 15:20:56 -06:00
|
|
|
const char *
|
|
|
|
XkbcAtomText(uint32_t atom)
|
2009-03-25 20:00:49 -06:00
|
|
|
{
|
2009-03-25 20:17:33 -06:00
|
|
|
NodePtr node;
|
|
|
|
|
2010-06-21 07:22:26 -06:00
|
|
|
if (do_get_atom_value)
|
|
|
|
return do_get_atom_value(atom);
|
|
|
|
|
2009-03-25 20:17:33 -06:00
|
|
|
if ((atom == None) || (atom > lastAtom))
|
|
|
|
return NULL;
|
|
|
|
if (!(node = nodeTable[atom]))
|
|
|
|
return NULL;
|
2010-06-15 12:30:30 -06:00
|
|
|
return node->string;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *
|
2010-06-28 04:50:12 -06:00
|
|
|
XkbcAtomGetString(uint32_t atom)
|
2010-06-15 12:30:30 -06:00
|
|
|
{
|
2010-06-30 15:20:56 -06:00
|
|
|
const char *ret = XkbcAtomText(atom);
|
2010-06-15 12:30:30 -06:00
|
|
|
return ret ? strdup(ret) : NULL;
|
|
|
|
}
|
|
|
|
|
2010-06-28 04:50:12 -06:00
|
|
|
static uint32_t
|
2010-06-21 07:22:26 -06:00
|
|
|
_XkbcMakeAtom(const char *string, unsigned len, Bool makeit)
|
2009-03-25 20:00:49 -06:00
|
|
|
{
|
2009-03-25 20:17:33 -06:00
|
|
|
NodePtr *np;
|
2009-03-25 20:00:49 -06:00
|
|
|
unsigned i;
|
2009-03-25 20:17:33 -06:00
|
|
|
int comp;
|
|
|
|
unsigned int fp = 0;
|
2009-03-25 20:00:49 -06:00
|
|
|
|
|
|
|
np = &atomRoot;
|
2009-03-25 20:17:33 -06:00
|
|
|
for (i = 0; i < (len + 1) / 2; i++) {
|
|
|
|
fp = fp * 27 + string[i];
|
|
|
|
fp = fp * 27 + string[len - 1 - i];
|
2009-03-25 20:00:49 -06:00
|
|
|
}
|
2009-03-25 20:17:33 -06:00
|
|
|
|
|
|
|
while (*np) {
|
|
|
|
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;
|
|
|
|
}
|
2009-03-25 20:00:49 -06:00
|
|
|
}
|
2009-03-25 20:17:33 -06:00
|
|
|
|
|
|
|
if (makeit) {
|
|
|
|
NodePtr nd;
|
|
|
|
|
2010-06-30 14:56:24 -06:00
|
|
|
nd = (NodePtr)malloc(sizeof(NodeRec));
|
2009-03-25 20:17:33 -06:00
|
|
|
if (!nd)
|
|
|
|
return BAD_RESOURCE;
|
|
|
|
|
2010-06-30 14:56:24 -06:00
|
|
|
nd->string = (char *)malloc(len + 1);
|
2009-03-25 20:17:33 -06:00
|
|
|
if (!nd->string) {
|
2010-06-30 14:56:24 -06:00
|
|
|
free(nd);
|
2009-03-25 20:17:33 -06:00
|
|
|
return BAD_RESOURCE;
|
|
|
|
}
|
|
|
|
strncpy(nd->string, string, (int)len);
|
|
|
|
nd->string[len] = 0;
|
|
|
|
|
|
|
|
if ((lastAtom + 1) >= tableLength) {
|
|
|
|
NodePtr *table;
|
2010-06-30 15:13:21 -06:00
|
|
|
int newLength;
|
|
|
|
|
|
|
|
if (tableLength == 0)
|
|
|
|
newLength = InitialTableSize;
|
|
|
|
else
|
|
|
|
newLength = tableLength * 2;
|
2009-03-25 20:17:33 -06:00
|
|
|
|
2010-06-30 15:13:21 -06:00
|
|
|
table = realloc(nodeTable, newLength * sizeof(NodePtr));
|
2009-03-25 20:17:33 -06:00
|
|
|
if (!table) {
|
|
|
|
if (nd->string != string)
|
2010-06-30 14:56:24 -06:00
|
|
|
free(nd->string);
|
|
|
|
free(nd);
|
2009-03-25 20:17:33 -06:00
|
|
|
return BAD_RESOURCE;
|
|
|
|
}
|
2010-06-30 15:13:21 -06:00
|
|
|
tableLength = newLength;
|
|
|
|
table[None] = NULL;
|
2009-03-25 20:17:33 -06:00
|
|
|
|
|
|
|
nodeTable = table;
|
|
|
|
}
|
|
|
|
|
|
|
|
*np = nd;
|
|
|
|
nd->left = nd->right = NULL;
|
|
|
|
nd->fingerPrint = fp;
|
|
|
|
nd->a = (++lastAtom);
|
|
|
|
*(nodeTable + lastAtom) = nd;
|
|
|
|
|
|
|
|
return nd->a;
|
2009-03-25 20:00:49 -06:00
|
|
|
}
|
|
|
|
else
|
2009-03-25 20:17:33 -06:00
|
|
|
return None;
|
2009-03-25 20:00:49 -06:00
|
|
|
}
|
|
|
|
|
2010-06-28 04:50:12 -06:00
|
|
|
uint32_t
|
2010-06-21 07:22:26 -06:00
|
|
|
XkbcInternAtom(const char *name, Bool onlyIfExists)
|
2009-03-25 20:00:49 -06:00
|
|
|
{
|
2009-03-25 20:17:33 -06:00
|
|
|
if (!name)
|
|
|
|
return None;
|
2010-06-21 07:22:26 -06:00
|
|
|
if (do_intern_atom)
|
|
|
|
return do_intern_atom(name);
|
2009-03-25 20:17:33 -06:00
|
|
|
return _XkbcMakeAtom(name, strlen(name), !onlyIfExists);
|
2009-03-25 20:00:49 -06:00
|
|
|
}
|