| 1 | /* Copyright Massachusetts Institute of Technology 1985 */ |
| 2 | #include "copyright.h" |
| 3 | |
| 4 | |
| 5 | #include <config.h> |
| 6 | #include <X11/Xlib.h> |
| 7 | #include <errno.h> |
| 8 | #include "X10.h" |
| 9 | |
| 10 | #ifndef NULL |
| 11 | #define NULL 0 |
| 12 | #endif |
| 13 | |
| 14 | /* |
| 15 | * XCreateAssocTable - Create an XAssocTable. The size argument should be |
| 16 | * a power of two for efficiency reasons. Some size suggestions: use 32 |
| 17 | * buckets per 100 objects; a reasonable maximum number of object per |
| 18 | * buckets is 8. If there is an error creating the XAssocTable, a NULL |
| 19 | * pointer is returned. |
| 20 | */ |
| 21 | XAssocTable *XCreateAssocTable(register int size) |
| 22 | /* Desired size of the table. */ |
| 23 | { |
| 24 | register XAssocTable *table; /* XAssocTable to be initialized. */ |
| 25 | register XAssoc *buckets; /* Pointer to the first bucket in */ |
| 26 | /* the bucket array. */ |
| 27 | |
| 28 | /* Malloc the XAssocTable. */ |
| 29 | if ((table = (XAssocTable *)malloc(sizeof(XAssocTable))) == NULL) { |
| 30 | /* malloc call failed! */ |
| 31 | errno = ENOMEM; |
| 32 | return(NULL); |
| 33 | } |
| 34 | |
| 35 | /* calloc the buckets (actually just their headers). */ |
| 36 | buckets = (XAssoc *)calloc((unsigned)size, (unsigned)sizeof(XAssoc)); |
| 37 | if (buckets == NULL) { |
| 38 | /* calloc call failed! */ |
| 39 | errno = ENOMEM; |
| 40 | return(NULL); |
| 41 | } |
| 42 | |
| 43 | /* Insert table data into the XAssocTable structure. */ |
| 44 | table->buckets = buckets; |
| 45 | table->size = size; |
| 46 | |
| 47 | while (--size >= 0) { |
| 48 | /* Initialize each bucket. */ |
| 49 | buckets->prev = buckets; |
| 50 | buckets->next = buckets; |
| 51 | buckets++; |
| 52 | } |
| 53 | |
| 54 | return(table); |
| 55 | } |
| 56 | |