diff options
Diffstat (limited to 'libxkbfile/src/xkbatom.c')
-rw-r--r-- | libxkbfile/src/xkbatom.c | 488 |
1 files changed, 243 insertions, 245 deletions
diff --git a/libxkbfile/src/xkbatom.c b/libxkbfile/src/xkbatom.c index 4fca90c62..b68b14b17 100644 --- a/libxkbfile/src/xkbatom.c +++ b/libxkbfile/src/xkbatom.c @@ -1,245 +1,243 @@ -/* $Xorg: xkbatom.c,v 1.4 2001/02/09 02:04:05 xorgcvs Exp $ */ -/*********************************************************** - -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. - - ********************************************************/ -/* $XFree86: xc/lib/xkbfile/xkbatom.c,v 3.8 2001/12/14 19:57:03 dawes Exp $ */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#include <stdio.h> -#include <ctype.h> -#include <stdlib.h> -#include <X11/Xos.h> -#include <X11/Xlib.h> -#include <X11/XKBlib.h> - -#include "XKMformat.h" -#include "XKBfileInt.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 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; -} - -static char * -_XkbNameForAtom(Atom atom) -{ - NodePtr node; - if (atom > lastAtom) return NULL; - if ((node = nodeTable[atom]) == (NodePtr)NULL) return NULL; - return strdup(node->string); -} - -static void -_XkbInitAtoms(void) -{ - tableLength = InitialTableSize; - nodeTable = (NodePtr *)_XkbAlloc(InitialTableSize*sizeof(NodePtr)); - nodeTable[None] = (NodePtr)NULL; -} - -/***====================================================================***/ - -char * -XkbAtomGetString(Display *dpy,Atom atm) -{ - if (atm==None) - return NULL; - if (dpy==NULL) - return _XkbNameForAtom(atm); - return XGetAtomName(dpy,atm); -} - -/***====================================================================***/ - -Atom -XkbInternAtom(Display *dpy,char *name,Bool onlyIfExists) -{ - if (name==NULL) - return None; - if (dpy==NULL) { - return _XkbMakeAtom(name, strlen(name), (!onlyIfExists)); - } - return XInternAtom(dpy,name,onlyIfExists); -} - -/***====================================================================***/ - -Atom -XkbChangeAtomDisplay(Display *oldDpy,Display *newDpy,Atom atm) -{ -char *tmp; - - if (atm!=None) { - tmp= XkbAtomGetString(oldDpy,atm); - if (tmp!=NULL) - return XkbInternAtom(newDpy,tmp,False); - } - return None; -} - -/***====================================================================***/ - -void -XkbInitAtoms(Display *dpy) -{ -static int been_here= 0; - if ((dpy==NULL)&&(!been_here)) { - _XkbInitAtoms(); - been_here= 1; - } - return; -} +/***********************************************************
+
+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 <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <X11/Xos.h>
+#include <X11/Xlib.h>
+#include <X11/XKBlib.h>
+
+#include "XKMformat.h"
+#include "XKBfileInt.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 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;
+}
+
+static char *
+_XkbNameForAtom(Atom atom)
+{
+ NodePtr node;
+ if (atom > lastAtom) return NULL;
+ if ((node = nodeTable[atom]) == (NodePtr)NULL) return NULL;
+ return strdup(node->string);
+}
+
+static void
+_XkbInitAtoms(void)
+{
+ tableLength = InitialTableSize;
+ nodeTable = (NodePtr *)_XkbAlloc(InitialTableSize*sizeof(NodePtr));
+ nodeTable[None] = (NodePtr)NULL;
+}
+
+/***====================================================================***/
+
+char *
+XkbAtomGetString(Display *dpy,Atom atm)
+{
+ if (atm==None)
+ return NULL;
+ if (dpy==NULL)
+ return _XkbNameForAtom(atm);
+ return XGetAtomName(dpy,atm);
+}
+
+/***====================================================================***/
+
+Atom
+XkbInternAtom(Display *dpy,char *name,Bool onlyIfExists)
+{
+ if (name==NULL)
+ return None;
+ if (dpy==NULL) {
+ return _XkbMakeAtom(name, strlen(name), (!onlyIfExists));
+ }
+ return XInternAtom(dpy,name,onlyIfExists);
+}
+
+/***====================================================================***/
+
+Atom
+XkbChangeAtomDisplay(Display *oldDpy,Display *newDpy,Atom atm)
+{
+char *tmp;
+
+ if (atm!=None) {
+ tmp= XkbAtomGetString(oldDpy,atm);
+ if (tmp!=NULL)
+ return XkbInternAtom(newDpy,tmp,False);
+ }
+ return None;
+}
+
+/***====================================================================***/
+
+void
+XkbInitAtoms(Display *dpy)
+{
+static int been_here= 0;
+ if ((dpy==NULL)&&(!been_here)) {
+ _XkbInitAtoms();
+ been_here= 1;
+ }
+ return;
+}
|