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