|
|
1.1 ! root 1: #ifndef lint ! 2: static char rcsid[] = "$Header: Quarks.c,v 1.3 87/09/11 21:24:19 haynes Rel $"; ! 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: /* File: Quarks.c - last edit by */ ! 28: ! 29: #include <sys/param.h> ! 30: #include "Xlib.h" ! 31: #include "Xlibos.h" ! 32: #include "Xresource.h" ! 33: #include "Quarks.h" ! 34: #include <strings.h> ! 35: ! 36: extern void bcopy(); ! 37: ! 38: ! 39: typedef int Signature; ! 40: ! 41: XrmQuark nextQuark = 1; /* next available quark number */ ! 42: ! 43: XrmAtom *quarkToAtomTable = NULL; ! 44: int maxQuarks = 0; /* max names in current quarkToAtomTable */ ! 45: #define QUARKQUANTUM 300 /* how much to extend quarkToAtomTable by */ ! 46: ! 47: typedef struct _NodeRec *Node; ! 48: typedef struct _NodeRec { ! 49: Node next; ! 50: Signature sig; ! 51: XrmQuark quark; ! 52: XrmAtom name; ! 53: } NodeRec; ! 54: ! 55: #define HASHTABLESIZE 1000 ! 56: static Node nodeTable[HASHTABLESIZE]; ! 57: ! 58: ! 59: ! 60: /* predefined quarks */ ! 61: ! 62: /* Representation types */ ! 63: ! 64: XrmQuark XrmQBoolean; ! 65: XrmQuark XrmQColor; ! 66: XrmQuark XrmQCursor; ! 67: XrmQuark XrmQDims; ! 68: XrmQuark XrmQDisplay; ! 69: XrmQuark XrmQFile; ! 70: XrmQuark XrmQFont; ! 71: XrmQuark XrmQFontStruct; ! 72: XrmQuark XrmQGeometry; ! 73: XrmQuark XrmQInt; ! 74: XrmQuark XrmQPixel; ! 75: XrmQuark XrmQPixmap; ! 76: XrmQuark XrmQPointer; ! 77: XrmQuark XrmQString; ! 78: XrmQuark XrmQWindow; ! 79: ! 80: /* "Enumeration" constants */ ! 81: ! 82: XrmQuark XrmQEfalse; ! 83: XrmQuark XrmQEno; ! 84: XrmQuark XrmQEoff; ! 85: XrmQuark XrmQEon; ! 86: XrmQuark XrmQEtrue; ! 87: XrmQuark XrmQEyes; ! 88: ! 89: ! 90: XrmQuark XrmAtomToQuark(name) ! 91: register XrmAtom name; ! 92: { ! 93: register Signature sig = 0; ! 94: register Signature scale = 27; ! 95: register XrmAtom tname; ! 96: register Node np; ! 97: register XrmAtom npn; ! 98: Node *hashp; ! 99: unsigned strLength; ! 100: ! 101: if (name == NULL) ! 102: return (NULLQUARK); ! 103: ! 104: /* Compute atom signature (sparse 31-bit hash value) */ ! 105: for (tname = name; *tname != '\0'; tname++) ! 106: sig = sig*scale + (unsigned int) *tname; ! 107: strLength = tname - name + 1; ! 108: if (sig < 0) ! 109: sig = -sig; ! 110: ! 111: /* Look for atom in hash table */ ! 112: hashp = &nodeTable[sig % HASHTABLESIZE]; ! 113: for (np = *hashp; np != NULL; np = np->next) { ! 114: if (np->sig == sig) { ! 115: for (npn=np->name, tname = name; ! 116: ((scale = *tname) != 0) && (scale == *npn); ++tname, ++npn) {}; ! 117: if (scale == *npn) { ! 118: return np->quark; ! 119: } ! 120: } ! 121: } ! 122: ! 123: /* Not found, add atom to hash table */ ! 124: np = (Node) Xmalloc (sizeof (NodeRec)); ! 125: np->next = *hashp; ! 126: *hashp = np; ! 127: np->sig = sig; ! 128: bcopy(name, (np->name = Xmalloc(strLength)), (int) strLength); ! 129: np->quark = nextQuark; ! 130: ! 131: if (nextQuark >= maxQuarks) { ! 132: maxQuarks += QUARKQUANTUM; ! 133: if (quarkToAtomTable != NULL) ! 134: quarkToAtomTable = (XrmAtom *) Xrealloc((char *) quarkToAtomTable, ! 135: (unsigned) maxQuarks * sizeof(XrmAtom)); ! 136: else ! 137: quarkToAtomTable = (XrmAtom *) Xcalloc( ! 138: (unsigned) maxQuarks, sizeof(XrmAtom)); ! 139: } ! 140: quarkToAtomTable[nextQuark] = np->name; ! 141: ++nextQuark; ! 142: return np->quark; ! 143: } ! 144: ! 145: extern XrmQuark XrmUniqueQuark() ! 146: { ! 147: XrmQuark quark; ! 148: ! 149: quark = nextQuark; ! 150: if (nextQuark >= maxQuarks) { ! 151: maxQuarks += QUARKQUANTUM; ! 152: if (quarkToAtomTable != NULL) ! 153: quarkToAtomTable = (XrmAtom *) Xrealloc((char *) quarkToAtomTable, ! 154: (unsigned) maxQuarks * sizeof(XrmAtom)); ! 155: else ! 156: quarkToAtomTable = (XrmAtom *) Xcalloc( ! 157: (unsigned) maxQuarks, sizeof(XrmAtom)); ! 158: } ! 159: quarkToAtomTable[nextQuark] = NULLATOM; ! 160: ++nextQuark; ! 161: return (quark); ! 162: } ! 163: ! 164: ! 165: XrmAtom XrmQuarkToAtom(quark) ! 166: XrmQuark quark; ! 167: { ! 168: if (quark <= 0 || quark >= nextQuark) ! 169: return NULLATOM; ! 170: return quarkToAtomTable[quark]; ! 171: } ! 172: ! 173: ! 174: void XrmStringToQuarkList(name, quarks) ! 175: register char *name; ! 176: register XrmQuarkList quarks; ! 177: { ! 178: register int i; ! 179: static char oneName[1000]; ! 180: ! 181: if (name != NULL) { ! 182: for (i = 0 ; (name[0] != '\0') ; name++) { ! 183: if (*name == '.') { ! 184: if (i == 0) { ! 185: /* Skip over leading . */ ! 186: } else { ! 187: oneName[i] = 0; ! 188: *quarks = XrmAtomToQuark(oneName); ! 189: quarks++; ! 190: i = 0; ! 191: } ! 192: } else { ! 193: oneName[i] = *name; ! 194: i++; ! 195: } ! 196: } ! 197: if (i != 0) { ! 198: oneName[i] = 0; ! 199: *quarks = XrmAtomToQuark(oneName); ! 200: quarks++; ! 201: } ! 202: } ! 203: *quarks = NULLQUARK; ! 204: } ! 205: ! 206: ! 207: XrmQuarkList XrmNewQuarkList() ! 208: { ! 209: register XrmQuarkList result; ! 210: ! 211: result = (XrmQuarkList) Xmalloc(sizeof(XrmQuark)); ! 212: *result = NULLQUARK; ! 213: return result; ! 214: } ! 215: ! 216: ! 217: /* ||| Could be replaced by define in Xresource.h, but Xfree being a macro ! 218: complicates things. */ ! 219: ! 220: XrmQuarkList XrmFreeQuarkList(list) ! 221: XrmQuarkList list; ! 222: { ! 223: Xfree((char *) list); ! 224: return (XrmQuarkList) NULL; ! 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.