|
|
1.1 ! root 1: /* $XConsortium: XMakeAssoc.c,v 10.18 91/01/06 12:09:28 rws Exp $ */ ! 2: /* Copyright Massachusetts Institute of Technology 1985 */ ! 3: ! 4: /* ! 5: Permission to use, copy, modify, distribute, and sell this software and its ! 6: documentation for any purpose is hereby granted without fee, provided that ! 7: the above copyright notice appear in all copies and that both that ! 8: copyright notice and this permission notice appear in supporting ! 9: documentation, and that the name of M.I.T. not be used in advertising or ! 10: publicity pertaining to distribution of the software without specific, ! 11: written prior permission. M.I.T. makes no representations about the ! 12: suitability of this software for any purpose. It is provided "as is" ! 13: without express or implied warranty. ! 14: */ ! 15: ! 16: #include "X11/Xlib.h" ! 17: #include "X10.h" ! 18: #include <errno.h> ! 19: ! 20: #ifndef NULL ! 21: #define NULL 0 ! 22: #endif ! 23: ! 24: extern int errno; ! 25: ! 26: extern int (*_XIOErrorFunction)(); /* X system error reporting routine. */ ! 27: ! 28: void insque(); ! 29: struct qelem { ! 30: struct qelem *q_forw; ! 31: struct qelem *q_back; ! 32: char q_data[1]; ! 33: }; ! 34: /* ! 35: * XMakeAssoc - Insert data into an XAssocTable keyed on an XId. ! 36: * Data is inserted into the table only once. Redundant inserts are ! 37: * meaningless (but cause no problems). The queue in each association ! 38: * bucket is sorted (lowest XId to highest XId). ! 39: */ ! 40: XMakeAssoc(dpy, table, x_id, data) ! 41: register Display *dpy; ! 42: register XAssocTable *table; ! 43: register XID x_id; ! 44: register caddr_t data; ! 45: { ! 46: int hash; ! 47: register XAssoc *bucket; ! 48: register XAssoc *Entry; ! 49: register XAssoc *new_entry; ! 50: ! 51: /* Hash the XId to get the bucket number. */ ! 52: hash = x_id & (table->size - 1); ! 53: /* Look up the bucket to get the entries in that bucket. */ ! 54: bucket = &table->buckets[hash]; ! 55: /* Get the first entry in the bucket. */ ! 56: Entry = bucket->next; ! 57: ! 58: /* If (Entry != bucket), the bucket is empty so make */ ! 59: /* the new entry the first entry in the bucket. */ ! 60: /* if (Entry == bucket), the we have to search the */ ! 61: /* bucket. */ ! 62: if (Entry != bucket) { ! 63: /* The bucket isn't empty, begin searching. */ ! 64: /* If we leave the for loop then we have either passed */ ! 65: /* where the entry should be or hit the end of the bucket. */ ! 66: /* In either case we should then insert the new entry */ ! 67: /* before the current value of "Entry". */ ! 68: for (; Entry != bucket; Entry = Entry->next) { ! 69: if (Entry->x_id == x_id) { ! 70: /* Entry has the same XId... */ ! 71: if (Entry->display == dpy) { ! 72: /* Entry has the same Display... */ ! 73: /* Therefore there is already an */ ! 74: /* entry with this XId and Display, */ ! 75: /* reset its data value and return. */ ! 76: Entry->data = data; ! 77: return; ! 78: } ! 79: /* We found an association with the right */ ! 80: /* id but the wrong display! */ ! 81: continue; ! 82: } ! 83: /* If the current entry's XId is greater than the */ ! 84: /* XId of the entry to be inserted then we have */ ! 85: /* passed the location where the new XId should */ ! 86: /* be inserted. */ ! 87: if (Entry->x_id > x_id) break; ! 88: } ! 89: } ! 90: ! 91: /* If we are here then the new entry should be inserted just */ ! 92: /* before the current value of "Entry". */ ! 93: /* Create a new XAssoc and load it with new provided data. */ ! 94: new_entry = (XAssoc *) malloc(sizeof(XAssoc)); ! 95: if (new_entry == NULL) { ! 96: /* Malloc failed! */ ! 97: errno = ENOMEM; ! 98: (*_XIOErrorFunction)(dpy); ! 99: } ! 100: new_entry->display = dpy; ! 101: new_entry->x_id = x_id; ! 102: new_entry->data = data; ! 103: ! 104: /* Insert the new entry. */ ! 105: insque((struct qelem *)new_entry, (struct qelem *)Entry->prev); ! 106: } ! 107:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.