diff options
author | Dave Love <fx@gnu.org> | 1999-10-03 19:36:13 +0000 |
---|---|---|
committer | Dave Love <fx@gnu.org> | 1999-10-03 19:36:13 +0000 |
commit | e745ede7473e87b93d71858bc1c8447a1307de28 (patch) | |
tree | 59353dca94fcb3a9ce2fd9f79614a3119da7f863 /oldXMenu/XMakeAssoc.c | |
parent | 0c898dd963a3277b5ec8d59f0a350e3fb50e50c3 (diff) | |
download | emacs-e745ede7473e87b93d71858bc1c8447a1307de28.tar.gz |
#
Diffstat (limited to 'oldXMenu/XMakeAssoc.c')
-rw-r--r-- | oldXMenu/XMakeAssoc.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/oldXMenu/XMakeAssoc.c b/oldXMenu/XMakeAssoc.c new file mode 100644 index 00000000000..d4682700ed2 --- /dev/null +++ b/oldXMenu/XMakeAssoc.c @@ -0,0 +1,102 @@ +/* $XConsortium: XMakeAssoc.c,v 10.18 91/01/06 12:09:28 rws Exp $ */ +/* Copyright Massachusetts Institute of Technology 1985 */ + +/* +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of M.I.T. not be used in advertising or +publicity pertaining to distribution of the software without specific, +written prior permission. M.I.T. makes no representations about the +suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. +*/ + +#include <config.h> +#include <X11/Xlib.h> +#include <X11/Xresource.h> +#include "X10.h" +#include <errno.h> + +#ifndef NULL +#define NULL 0 +#endif + +extern int errno; + +void emacs_insque(); +struct qelem { + struct qelem *q_forw; + struct qelem *q_back; + char q_data[1]; +}; +/* + * XMakeAssoc - Insert data into an XAssocTable keyed on an XId. + * Data is inserted into the table only once. Redundant inserts are + * meaningless (but cause no problems). The queue in each association + * bucket is sorted (lowest XId to highest XId). + */ +XMakeAssoc(dpy, table, x_id, data) + register Display *dpy; + register XAssocTable *table; + register XID x_id; + register caddr_t data; +{ + int hash; + register XAssoc *bucket; + register XAssoc *Entry; + register XAssoc *new_entry; + + /* Hash the XId to get the bucket number. */ + hash = x_id & (table->size - 1); + /* Look up the bucket to get the entries in that bucket. */ + bucket = &table->buckets[hash]; + /* Get the first entry in the bucket. */ + Entry = bucket->next; + + /* If (Entry != bucket), the bucket is empty so make */ + /* the new entry the first entry in the bucket. */ + /* if (Entry == bucket), the we have to search the */ + /* bucket. */ + if (Entry != bucket) { + /* The bucket isn't empty, begin searching. */ + /* If we leave the for loop then we have either passed */ + /* where the entry should be or hit the end of the bucket. */ + /* In either case we should then insert the new entry */ + /* before the current value of "Entry". */ + for (; Entry != bucket; Entry = Entry->next) { + if (Entry->x_id == x_id) { + /* Entry has the same XId... */ + if (Entry->display == dpy) { + /* Entry has the same Display... */ + /* Therefore there is already an */ + /* entry with this XId and Display, */ + /* reset its data value and return. */ + Entry->data = data; + return; + } + /* We found an association with the right */ + /* id but the wrong display! */ + continue; + } + /* If the current entry's XId is greater than the */ + /* XId of the entry to be inserted then we have */ + /* passed the location where the new XId should */ + /* be inserted. */ + if (Entry->x_id > x_id) break; + } + } + + /* If we are here then the new entry should be inserted just */ + /* before the current value of "Entry". */ + /* Create a new XAssoc and load it with new provided data. */ + new_entry = (XAssoc *) xmalloc(sizeof(XAssoc)); + new_entry->display = dpy; + new_entry->x_id = x_id; + new_entry->data = data; + + /* Insert the new entry. */ + emacs_insque((struct qelem *)new_entry, (struct qelem *)Entry->prev); +} + |