1/* Copyright Massachusetts Institute of Technology 1985 */ 2 3#include "copyright.h" 4 5 6#include <config.h> 7#include <X11/Xlib.h> 8#include <X11/Xresource.h> 9#include "X10.h" 10#include <errno.h> 11 12#ifndef NULL 13#define NULL 0 14#endif 15 16extern int errno; 17 18void emacs_insque(); 19struct qelem { 20 struct qelem *q_forw; 21 struct qelem *q_back; 22 char q_data[1]; 23}; 24/* 25 * XMakeAssoc - Insert data into an XAssocTable keyed on an XId. 26 * Data is inserted into the table only once. Redundant inserts are 27 * meaningless (but cause no problems). The queue in each association 28 * bucket is sorted (lowest XId to highest XId). 29 */ 30XMakeAssoc(dpy, table, x_id, data) 31 register Display *dpy; 32 register XAssocTable *table; 33 register XID x_id; 34 register caddr_t data; 35{ 36 int hash; 37 register XAssoc *bucket; 38 register XAssoc *Entry; 39 register XAssoc *new_entry; 40 41 /* Hash the XId to get the bucket number. */ 42 hash = x_id & (table->size - 1); 43 /* Look up the bucket to get the entries in that bucket. */ 44 bucket = &table->buckets[hash]; 45 /* Get the first entry in the bucket. */ 46 Entry = bucket->next; 47 48 /* If (Entry != bucket), the bucket is empty so make */ 49 /* the new entry the first entry in the bucket. */ 50 /* if (Entry == bucket), the we have to search the */ 51 /* bucket. */ 52 if (Entry != bucket) { 53 /* The bucket isn't empty, begin searching. */ 54 /* If we leave the for loop then we have either passed */ 55 /* where the entry should be or hit the end of the bucket. */ 56 /* In either case we should then insert the new entry */ 57 /* before the current value of "Entry". */ 58 for (; Entry != bucket; Entry = Entry->next) { 59 if (Entry->x_id == x_id) { 60 /* Entry has the same XId... */ 61 if (Entry->display == dpy) { 62 /* Entry has the same Display... */ 63 /* Therefore there is already an */ 64 /* entry with this XId and Display, */ 65 /* reset its data value and return. */ 66 Entry->data = data; 67 return; 68 } 69 /* We found an association with the right */ 70 /* id but the wrong display! */ 71 continue; 72 } 73 /* If the current entry's XId is greater than the */ 74 /* XId of the entry to be inserted then we have */ 75 /* passed the location where the new XId should */ 76 /* be inserted. */ 77 if (Entry->x_id > x_id) break; 78 } 79 } 80 81 /* If we are here then the new entry should be inserted just */ 82 /* before the current value of "Entry". */ 83 /* Create a new XAssoc and load it with new provided data. */ 84 new_entry = (XAssoc *) malloc(sizeof(XAssoc)); 85 new_entry->display = dpy; 86 new_entry->x_id = x_id; 87 new_entry->data = data; 88 89 /* Insert the new entry. */ 90 emacs_insque((struct qelem *)new_entry, (struct qelem *)Entry->prev); 91} 92 93/* arch-tag: d7e3fb8a-f3b3-4c5d-a307-75ca67ec1b49 94 (do not change this comment) */ 95