diff oldXMenu/XMakeAssoc.c @ 25858:bbce331da1be

#
author Dave Love <fx@gnu.org>
date Sun, 03 Oct 1999 19:36:13 +0000
parents
children 23a1cea22d13
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/oldXMenu/XMakeAssoc.c	Sun Oct 03 19:36:13 1999 +0000
@@ -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);
+}
+