int mu_iterator_dup (mu_iterator_t *piterator, mu_iterator_t orig) { mu_iterator_t iterator; int status; if (piterator == NULL) return MU_ERR_OUT_PTR_NULL; if (orig == NULL) return EINVAL; status = mu_iterator_create (&iterator, orig->owner); if (status) return status; status = orig->dup (&iterator->owner, orig->owner); if (status) { free (iterator); return status; } iterator->is_advanced = orig->is_advanced; iterator->dup = orig->dup; iterator->destroy = orig->destroy; iterator->first = orig->first; iterator->next = orig->next; iterator->getitem = orig->getitem; iterator->delitem = orig->delitem; iterator->finished_p = orig->finished_p; iterator->itrctl = orig->itrctl; *piterator = iterator; return 0; }
int mu_mailbox_get_iterator (mu_mailbox_t mbx, mu_iterator_t *piterator) { mu_iterator_t iterator; int status; struct mailbox_iterator *itr; if (!mbx) return EINVAL; itr = calloc (1, sizeof *itr); if (!itr) return ENOMEM; itr->mbx = mbx; itr->idx = 1; status = mu_iterator_create (&iterator, itr); if (status) { free (itr); return status; } mu_iterator_set_first (iterator, mbx_first); mu_iterator_set_next (iterator, mbx_next); mu_iterator_set_getitem (iterator, mbx_getitem); mu_iterator_set_finished_p (iterator, mbx_finished_p); mu_iterator_set_curitem_p (iterator, mbx_curitem_p); mu_iterator_set_destroy (iterator, mbx_destroy); mu_iterator_set_dup (iterator, mbx_data_dup); mu_iterator_attach (&mbx->iterator, iterator); *piterator = iterator; return 0; }