int listIteratorSetCurEntry(LIST_ITERATOR_T *iter, LIST_ENTRY_T *entry, bool_t validateEnt) { LIST_ENTRY_T *savedCurEnt; LIST_ENTRY_T *ent; if (validateEnt) { bool_t found = FALSE; savedCurEnt = iter->curEnt; iter->curEnt = listGetFrontEntry(iter->list); for (ent = listIteratorGetCurEntry(iter); ! listIteratorIsEndOfList(iter); listIteratorNext(iter, (LIST_ENTRY_T **)&ent)) { if (ent == entry) { found = TRUE; break; } } if (! found) { listerrno = LIST_ERR_BADARG; iter->curEnt = savedCurEnt; return -1; } } iter->curEnt = entry; return 0; }
int listNotifyObservers(LIST_T *list, LIST_EVENT_T *event) { LIST_OBSERVER_T *observer; LIST_ITERATOR_T iter; listIteratorAttach(&iter, list->observers); for (observer = (LIST_OBSERVER_T *)listIteratorGetCurEntry(&iter); ! listIteratorIsEndOfList(&iter); listIteratorNext(&iter, (LIST_ENTRY_T **)&observer)) { if (observer->select != NULL) { if (! (*observer->select)(observer->extra, event)) continue; } switch (event->type) { case (int) LIST_EVENT_ENTER: if (observer->enter) (*observer->enter)(list, observer->extra, event); break; case (int) LIST_EVENT_LEAVE: if (observer->leave_) (*observer->leave_)(list, observer->extra, event); break; default: listerrno = LIST_ERR_BADARG; return -1; } } return 0; }
void listDump(LIST_T* list) { LIST_ITERATOR_T iter; LIST_ENTRY_T *listEntry; LIST_ITERATOR_ZERO_OUT(&iter); listIteratorAttach(&iter, list); for (listEntry = listIteratorGetCurEntry(&iter); ! listIteratorIsEndOfList(&iter); listIteratorNext(&iter, &listEntry)) { ls_syslog(LOG_DEBUG,"\ %s: Entry=<%x> is in list=<%s>", __func__, listEntry, list->name); } listIteratorDetach(&iter); }