|
|
1.1 ! root 1: #ifndef lint ! 2: static char *sccsid = "@(#)Atom.c 1.21 3/19/87"; ! 3: #endif lint ! 4: ! 5: /* ! 6: * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. ! 7: * ! 8: * All Rights Reserved ! 9: * ! 10: * Permission to use, copy, modify, and distribute this software and its ! 11: * documentation for any purpose and without fee is hereby granted, ! 12: * provided that the above copyright notice appear in all copies and that ! 13: * both that copyright notice and this permission notice appear in ! 14: * supporting documentation, and that the name of Digital Equipment ! 15: * Corporation not be used in advertising or publicity pertaining to ! 16: * distribution of the software without specific, written prior permission. ! 17: * ! 18: * ! 19: * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ! 20: * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ! 21: * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ! 22: * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ! 23: * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ! 24: * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ! 25: * SOFTWARE. ! 26: */ ! 27: ! 28: ! 29: /* File: Quarks.c - last edit by */ ! 30: ! 31: #include <sys/param.h> ! 32: #include "Xlib.h" ! 33: #include "Xlibos.h" ! 34: #include "Xresource.h" ! 35: #include "Quarks.h" ! 36: #include <strings.h> ! 37: ! 38: extern void bcopy(); ! 39: ! 40: ! 41: typedef int Signature; ! 42: ! 43: static XrmQuark nextQuark = 1; /* next available quark number */ ! 44: static XrmAtom *quarkToAtomTable = NULL; ! 45: static int maxQuarks = 0; /* max names in current quarkToAtomTable */ ! 46: #define QUARKQUANTUM 300 /* how much to extend quarkToAtomTable by */ ! 47: ! 48: typedef struct _NodeRec *Node; ! 49: typedef struct _NodeRec { ! 50: Node next; ! 51: Signature sig; ! 52: XrmQuark quark; ! 53: XrmAtom name; ! 54: } NodeRec; ! 55: ! 56: #define HASHTABLESIZE 1000 ! 57: static Node nodeTable[HASHTABLESIZE]; ! 58: ! 59: ! 60: ! 61: /* predefined quarks */ ! 62: ! 63: /* Representation types */ ! 64: ! 65: XrmQuark XrmQBoolean; ! 66: XrmQuark XrmQColor; ! 67: XrmQuark XrmQCursor; ! 68: XrmQuark XrmQDims; ! 69: XrmQuark XrmQDisplay; ! 70: XrmQuark XrmQFile; ! 71: XrmQuark XrmQFont; ! 72: XrmQuark XrmQFontStruct; ! 73: XrmQuark XrmQGeometry; ! 74: XrmQuark XrmQInt; ! 75: XrmQuark XrmQPixel; ! 76: XrmQuark XrmQPixmap; ! 77: XrmQuark XrmQPointer; ! 78: XrmQuark XrmQString; ! 79: XrmQuark XrmQWindow; ! 80: ! 81: /* "Enumeration" constants */ ! 82: ! 83: XrmQuark XrmQEfalse; ! 84: XrmQuark XrmQEno; ! 85: XrmQuark XrmQEoff; ! 86: XrmQuark XrmQEon; ! 87: XrmQuark XrmQEtrue; ! 88: XrmQuark XrmQEyes; ! 89: ! 90: ! 91: static XrmAllocMoreQuartToAtomTable() ! 92: { ! 93: unsigned size; ! 94: ! 95: maxQuarks += QUARKQUANTUM; ! 96: size = (unsigned) maxQuarks * sizeof(XrmAtom); ! 97: if (quarkToAtomTable == (XrmAtom *)NULL) ! 98: quarkToAtomTable = (XrmAtom *) Xmalloc(size); ! 99: else ! 100: quarkToAtomTable = ! 101: (XrmAtom *) Xrealloc((char *) quarkToAtomTable, size); ! 102: } ! 103: ! 104: XrmQuark XrmAtomToQuark(name) ! 105: register XrmAtom name; ! 106: { ! 107: register Signature sig = 0; ! 108: register Signature scale = 27; ! 109: register XrmAtom tname; ! 110: register Node np; ! 111: register XrmAtom npn; ! 112: Node *hashp; ! 113: unsigned strLength; ! 114: ! 115: if (name == NULL) ! 116: return (NULLQUARK); ! 117: ! 118: /* Compute atom signature (sparse 31-bit hash value) */ ! 119: for (tname = name; *tname != '\0'; tname++) ! 120: sig = sig*scale + (unsigned int) *tname; ! 121: strLength = tname - name + 1; ! 122: if (sig < 0) ! 123: sig = -sig; ! 124: ! 125: /* Look for atom in hash table */ ! 126: hashp = &nodeTable[sig % HASHTABLESIZE]; ! 127: for (np = *hashp; np != NULL; np = np->next) { ! 128: if (np->sig == sig) { ! 129: for (npn=np->name, tname = name; ! 130: ((scale = *tname) != 0) && (scale == *npn); ++tname, ++npn) {}; ! 131: if (scale == *npn) { ! 132: return np->quark; ! 133: } ! 134: } ! 135: } ! 136: ! 137: /* Not found, add atom to hash table */ ! 138: np = (Node) Xmalloc (sizeof (NodeRec)); ! 139: np->next = *hashp; ! 140: *hashp = np; ! 141: np->sig = sig; ! 142: bcopy(name, (np->name = Xmalloc(strLength)), (int) strLength); ! 143: np->quark = nextQuark; ! 144: ! 145: if (nextQuark >= maxQuarks) ! 146: XrmAllocMoreQuartToAtomTable(); ! 147: ! 148: quarkToAtomTable[nextQuark] = np->name; ! 149: ++nextQuark; ! 150: return np->quark; ! 151: } ! 152: ! 153: extern XrmQuark XrmUniqueQuark() ! 154: { ! 155: XrmQuark quark; ! 156: ! 157: quark = nextQuark; ! 158: if (nextQuark >= maxQuarks) ! 159: XrmAllocMoreQuartToAtomTable(); ! 160: quarkToAtomTable[nextQuark] = NULLATOM; ! 161: ++nextQuark; ! 162: return (quark); ! 163: } ! 164: ! 165: ! 166: XrmAtom XrmQuarkToAtom(quark) ! 167: XrmQuark quark; ! 168: { ! 169: if (quark <= 0 || quark >= nextQuark) ! 170: return NULLATOM; ! 171: return quarkToAtomTable[quark]; ! 172: } ! 173: ! 174: ! 175: void XrmStringToQuarkList(name, quarks) ! 176: register char *name; ! 177: register XrmQuarkList quarks; ! 178: { ! 179: register int i; ! 180: static char oneName[1000]; ! 181: ! 182: if (name != NULL) { ! 183: for (i = 0 ; (name[0] != '\0') ; name++) { ! 184: if (*name == '.') { ! 185: if (i == 0) { ! 186: /* Skip over leading . */ ! 187: } else { ! 188: oneName[i] = 0; ! 189: *quarks = XrmAtomToQuark(oneName); ! 190: quarks++; ! 191: i = 0; ! 192: } ! 193: } else { ! 194: oneName[i] = *name; ! 195: i++; ! 196: } ! 197: } ! 198: if (i != 0) { ! 199: oneName[i] = 0; ! 200: *quarks = XrmAtomToQuark(oneName); ! 201: quarks++; ! 202: } ! 203: } ! 204: *quarks = NULLQUARK; ! 205: } ! 206: ! 207: ! 208: XrmQuarkList XrmNewQuarkList() ! 209: { ! 210: register XrmQuarkList result; ! 211: ! 212: result = (XrmQuarkList) Xmalloc(sizeof(XrmQuark)); ! 213: *result = NULLQUARK; ! 214: return result; ! 215: } ! 216: ! 217: ! 218: /* ||| Could be replaced by define in Xresource.h, but Xfree being a macro ! 219: complicates things. */ ! 220: ! 221: XrmQuarkList XrmFreeQuarkList(list) ! 222: XrmQuarkList list; ! 223: { ! 224: Xfree((char *) list); ! 225: } ! 226: ! 227: ! 228: ! 229: /* Return the number of elements in an atomlist. */ ! 230: ! 231: int XrmQuarkListLength(list) ! 232: register XrmQuarkList list; ! 233: { ! 234: register int result; ! 235: ! 236: for (result = 0; *list != NULLQUARK ; result++, list++) ; ! 237: return result; ! 238: } ! 239: ! 240: ! 241: XrmQuarkList XrmCopyQuarkList(list) ! 242: register XrmQuarkList list; ! 243: { ! 244: register int length; ! 245: register XrmQuarkList result, dest; ! 246: ! 247: length = XrmQuarkListLength(list)+1; ! 248: result = (XrmQuarkList) Xcalloc((unsigned) length, sizeof(XrmQuark)); ! 249: for (dest = result; --length >= 0 ; dest++, list++) ! 250: *dest = *list; ! 251: return result; ! 252: } ! 253: ! 254: ! 255: void QuarkInitialize() ! 256: { ! 257: /* Representation types */ ! 258: ! 259: XrmQBoolean = XrmAtomToQuark(XrmRBoolean); ! 260: XrmQColor = XrmAtomToQuark(XrmRColor); ! 261: XrmQCursor = XrmAtomToQuark(XrmRCursor); ! 262: XrmQDims = XrmAtomToQuark(XrmRDims); ! 263: XrmQDisplay = XrmAtomToQuark(XrmRDisplay); ! 264: XrmQFile = XrmAtomToQuark(XrmRFile); ! 265: XrmQFont = XrmAtomToQuark(XrmRFont); ! 266: XrmQFontStruct = XrmAtomToQuark(XrmRFontStruct); ! 267: XrmQGeometry = XrmAtomToQuark(XrmRGeometry); ! 268: XrmQInt = XrmAtomToQuark(XrmRInt); ! 269: XrmQPixel = XrmAtomToQuark(XrmRPixel); ! 270: XrmQPixmap = XrmAtomToQuark(XrmRPixmap); ! 271: XrmQPointer = XrmAtomToQuark(XrmRPointer); ! 272: XrmQString = XrmAtomToQuark(XrmRString); ! 273: XrmQWindow = XrmAtomToQuark(XrmRWindow); ! 274: ! 275: /* Boolean enumeration constants */ ! 276: ! 277: XrmQEfalse = XrmAtomToQuark(XrmEfalse); ! 278: XrmQEno = XrmAtomToQuark(XrmEno); ! 279: XrmQEoff = XrmAtomToQuark(XrmEoff); ! 280: XrmQEon = XrmAtomToQuark(XrmEon); ! 281: XrmQEtrue = XrmAtomToQuark(XrmEtrue); ! 282: XrmQEyes = XrmAtomToQuark(XrmEyes); ! 283: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.