static void test_11() { slist sl; slist *l = &sl; slist_init(l); slist_add(l, (void *)1); slist_add(l, (void *)2); ASSERT((int)slist_remove_last(l) == 2); ASSERT((int)slist_length(l) == 1); ASSERT((int)slist_remove_last(l) == 1); ASSERT((int)slist_length(l) == 0); }
bool slist_remove(SList *plist, unsigned int ipos, char *pdata, size_t isize) { if (ipos >= plist->icount) return false; else if (ipos == 0) return slist_remove_first(plist, pdata, isize); else if (ipos == plist->icount - 1) return slist_remove_last(plist, pdata, isize); else { ListNode *pbefore = plist->pfirst; for (int i = 1; i < ipos; i++) pbefore = pbefore->pnext; ListNode *pcur = pbefore->pnext; ListNode *pafter = pcur->pnext; if (pdata != NULL && isize > 0) { int iminsize = isize > pcur->isize ? pcur->isize : isize; memcpy(pdata, pcur->pdata, iminsize); } slistnode_free(pcur); plist->icount--; pbefore->pnext = pafter; } return true; }