Annotation of researchv9/X11/src/X.V11R1/server/dix/atom.c, revision 1.1

1.1     ! root        1: /***********************************************************
        !             2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
        !             3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
        !             4: 
        !             5:                         All Rights Reserved
        !             6: 
        !             7: Permission to use, copy, modify, and distribute this software and its 
        !             8: documentation for any purpose and without fee is hereby granted, 
        !             9: provided that the above copyright notice appear in all copies and that
        !            10: both that copyright notice and this permission notice appear in 
        !            11: supporting documentation, and that the names of Digital or MIT not be
        !            12: used in advertising or publicity pertaining to distribution of the
        !            13: software without specific, written prior permission.  
        !            14: 
        !            15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
        !            16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
        !            17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
        !            18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
        !            19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
        !            20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
        !            21: SOFTWARE.
        !            22: 
        !            23: ******************************************************************/
        !            24: 
        !            25: /* $Header: atom.c,v 1.21 87/09/11 07:18:24 toddb Exp $ */
        !            26: 
        !            27: #include "X.h"
        !            28: #include "Xatom.h"
        !            29: #include "misc.h"
        !            30: 
        !            31: #define InitialTableSize 100
        !            32: 
        !            33: char *Xalloc();
        !            34: 
        !            35: typedef struct _Node {
        !            36:     struct _Node   *left,   *right;
        !            37:     Atom a;
        !            38:     unsigned int fingerPrint;
        !            39:     char   *string;
        !            40: } NodeRec, *NodePtr;
        !            41: 
        !            42: static Atom lastAtom = None;
        !            43: static NodePtr atomRoot = (NodePtr)NULL;
        !            44: static int tableLength;
        !            45: static NodePtr *nodeTable;
        !            46: 
        !            47: Atom 
        !            48: MakeAtom(string, len, makeit)
        !            49:     char *string;
        !            50:     int len;
        !            51:     Bool makeit;
        !            52: {
        !            53:     register    NodePtr * np;
        !            54:     int     comp, i;
        !            55:     register unsigned int   fp = 0;
        !            56: 
        !            57:     np = &atomRoot;
        !            58:     for (i = 0; i < (len+1)/2; i++)
        !            59:     {
        !            60:        fp = fp * 27 + string[i];
        !            61:        fp = fp * 27 + string[len - 1 - i];
        !            62:     }
        !            63:     while (*np != (NodePtr) NULL)
        !            64:     {
        !            65:        if (fp < (*np)->fingerPrint)
        !            66:            np = &((*np)->left);
        !            67:        else if (fp > (*np)->fingerPrint)
        !            68:            np = &((*np)->right);
        !            69:        else
        !            70:        {                              /* now start testing the strings */
        !            71:            comp = strncmp(string, (*np)->string, len);
        !            72:            if ((comp < 0) || ((comp == 0) && (len < strlen((*np)->string))))
        !            73:                np = &((*np)->left);
        !            74:            else if (comp > 0)
        !            75:                np = &((*np)->right);
        !            76:            else
        !            77:                return(*np)->a;
        !            78:            }
        !            79:     }
        !            80:     if (makeit)
        !            81:     {
        !            82:        *np = (NodePtr) Xalloc(sizeof(NodeRec));
        !            83:        (*np)->left = (*np)->right = (NodePtr) NULL;
        !            84:        (*np)->fingerPrint = fp;
        !            85:        (*np)->a = (++lastAtom);
        !            86:        strncpy((*np)->string = Xalloc(len + 1), string, len);
        !            87:        (*np)->string[len] = 0;
        !            88:        if (lastAtom >= tableLength)
        !            89:        {
        !            90:            tableLength *= 2;
        !            91:            nodeTable = (NodePtr *) Xrealloc(
        !            92:                    nodeTable, tableLength * sizeof(NodePtr));
        !            93:        }
        !            94:        nodeTable[lastAtom] = *np;
        !            95:        return(*np)->a;
        !            96:     }
        !            97:     else
        !            98:        return None;
        !            99: }
        !           100: 
        !           101: ValidAtom(atom)
        !           102:     Atom atom;
        !           103: {
        !           104:     return (atom != None) && (atom <= lastAtom);
        !           105: }
        !           106: 
        !           107: char *
        !           108: NameForAtom(atom)
        !           109:     Atom atom;
        !           110: {
        !           111:     NodePtr node;
        !           112:     if (atom > lastAtom) return 0;
        !           113:     if ((node = nodeTable[atom]) == (NodePtr)NULL) return 0;
        !           114:     return node->string;
        !           115: }
        !           116: 
        !           117: AtomError()
        !           118: {
        !           119:     FatalError("initializing atoms");
        !           120: }
        !           121: 
        !           122: InitAtoms()
        !           123: {
        !           124:     FreeAllAtoms();
        !           125:     tableLength = InitialTableSize;
        !           126:     nodeTable = (NodePtr *)Xalloc(InitialTableSize*sizeof(NodePtr));
        !           127:     nodeTable[None] = (NodePtr)NULL;
        !           128:     MakePredeclaredAtoms();
        !           129:     if (lastAtom != XA_LAST_PREDEFINED)
        !           130:        AtomError ();
        !           131: }
        !           132: 
        !           133: FreeAllAtoms()
        !           134: {
        !           135:     if(atomRoot == (NodePtr)NULL)
        !           136:        return;
        !           137:     FreeAtom(atomRoot);
        !           138:     atomRoot = (NodePtr)NULL;
        !           139:     Xfree(nodeTable);
        !           140:     nodeTable = (NodePtr *)NULL;
        !           141:     lastAtom = None;
        !           142: }
        !           143: 
        !           144: FreeAtom(patom)
        !           145:     NodePtr patom;
        !           146: {
        !           147:     if(patom->left)
        !           148:        FreeAtom(patom->left);
        !           149:     if(patom->right)
        !           150:        FreeAtom(patom->right);
        !           151:     Xfree(patom->string);
        !           152:     Xfree(patom);
        !           153: }
        !           154:     

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.