/* seek to first */ void skiplist_iter_seektofirst(struct skiplist_iter *iter) { struct skipnode *n; n = _get_next(iter->list->header, 0); iter->node = n; }
/* next */ void skiplist_iter_next(struct skiplist_iter *iter) { struct skipnode *n; nassert(skiplist_iter_valid(iter)); n = _get_next(iter->node, 0); iter->node = n; }
int strStr_kmp(char* s, char* p) { int sn = strlen(s), pn = strlen(p); int * next = _get_next(p, pn); int si = 0, pi = 0; //print_array(next, pn + 1); for (si = 0; si <= sn - pn; si ++) { while (pi < pn && *(s + si + pi) == *(p + pi)) pi ++; if (pi == pn) { free(next); return si; } pi = next[pi]; } free(next); return -1; }
static void _evtimer_handler(void *arg) { DEBUG("_evtimer_handler()\n"); evtimer_t *evtimer = (evtimer_t *)arg; /* this function gets called directly by xtimer if the set xtimer expired. * Thus the offset of the first event is down to zero. */ evtimer_event_t *event = evtimer->events; event->offset = 0; /* iterate the event list */ while ((event = _get_next(evtimer))) { evtimer->callback(event); } _update_timer(evtimer); }
struct skipnode *skiplist_find_less_than(struct skiplist *sl, void *key) { int height; struct skipnode *x; height = _get_height(sl) - 1; x = sl->header; while (1) { struct skipnode *next = _get_next(x, height);; if (next == NULL || sl->compare_cb(next->key, key) >= 0) { if (height == 0) return x; else height--; } else { x = next; } } }
struct skipnode *skiplist_find_last(struct skiplist *sl) { int level; struct skipnode *x; x = sl->header; level = _get_height(sl) - 1; while (1) { struct skipnode *next; next = _get_next(x, level); if (next == NULL) { if (level == 0) return x; else level--; } else { x = next; } } }