root/trunk/oldXMenu/XMakeAssoc.c

Revision 4210, 2.7 kB (checked in by miyoshi, 2 years ago)

Sync up with Emacs_22_BASE.

  • Property svn:eol-style set to native
Line 
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
16 extern int errno;
17
18 void emacs_insque();
19 struct 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  */
30 XMakeAssoc(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) */
Note: See TracBrowser for help on using the browser.