void *NMultiSet(MULTI *ma, int *k, void *d) { int i, j, m = 0, h; MDATA *pt = NULL; ARRAY *a; DATA *p, *p0 = NULL; if (ma->maxelem > 0 && ma->numelem >= ma->maxelem) { NMultiFreeData(ma); ma->numelem = 0; } h = Hash2(k, ma->ndim, 0, ma->ndim); a = &(ma->array[h]); if (a->dim == 0) { a->data = (DATA *) malloc(sizeof(DATA)); a->data->dptr = malloc(a->bsize); InitMDataData(a->data->dptr, a->block); a->data->next = NULL; pt = (MDATA *) a->data->dptr; } else { p = a->data; i = a->dim; j = 0; while (p) { pt = (MDATA *) p->dptr; for (m = 0; m < a->block && j < i; j++, m++) { if (memcmp(pt->index, k, ma->isize) == 0) { if (d) { memcpy(pt->data, d, ma->esize); } return pt->data; } pt++; } p0 = p; p = p->next; } if (m == a->block) { p0->next = (DATA *) malloc(sizeof(DATA)); p = p0->next; p->dptr = malloc(a->bsize); InitMDataData(p->dptr, a->block); p->next = NULL; pt = (MDATA *) p->dptr; } } ma->numelem++; pt->index = malloc(ma->isize); memcpy(pt->index, k, ma->isize); pt->data = malloc(ma->esize); if (a && a->InitData) a->InitData(pt->data, 1); if (d) memcpy(pt->data, d, ma->esize); (a->dim)++; return pt->data; }