Object Sdr_list_insert_last(const char *file, int line, Sdr sdrv, Object list, Address data) { SdrList listBuffer; Object elt; SdrListElt eltBuffer; if (!(sdr_in_xn(sdrv))) { oK(_iEnd(file, line, _notInXnMsg())); return 0; } joinTrace(sdrv, file, line); if (list == 0) { oK(_xniEnd(file, line, "list", sdrv)); return 0; } /* create new element */ elt = _sdrzalloc(sdrv, sizeof(SdrListElt)); if (elt == 0) { oK(_iEnd(file, line, "elt")); return 0; } sdr_list__elt_clear(&eltBuffer); eltBuffer.list = list; eltBuffer.data = data; /* insert new element at the end of the list */ sdrFetch(listBuffer, (Address) list); eltBuffer.prev = listBuffer.last; eltBuffer.next = 0; sdrPut((Address) elt, eltBuffer); if (listBuffer.last != 0) { sdrFetch(eltBuffer, (Address) listBuffer.last); eltBuffer.next = elt; sdrPut((Address) listBuffer.last, eltBuffer); } else { listBuffer.first = elt; } listBuffer.last = elt; listBuffer.length += 1; sdrPut((Address) list, listBuffer); return elt; }
void Sdr_list_destroy(char *file, int line, Sdr sdrv, Object list, SdrListDeleteFn deleteFn, void *arg) { SdrList listBuffer; Object elt; Object next; SdrListElt eltBuffer; if (!(sdr_in_xn(sdrv))) { oK(_iEnd(file, line, _notInXnMsg())); return; } joinTrace(sdrv, file, line); if (list == 0) { oK(_xniEnd(file, line, "list", sdrv)); return; } sdrFetch(listBuffer, (Address) list); for (elt = listBuffer.first; elt != 0; elt = next) { sdrFetch(eltBuffer, (Address) elt); next = eltBuffer.next; if (deleteFn) { deleteFn(sdrv, eltBuffer.data, arg); } /* just in case user mistakenly accesses later... */ sdr_list__elt_clear(&eltBuffer); sdrPut((Address) elt, eltBuffer); sdrFree(elt); } /* just in case user mistakenly accesses later... */ sdr_list__clear(&listBuffer); sdrPut((Address) list, listBuffer); sdrFree(list); }
void Sdr_list_user_data_set(char *file, int line, Sdr sdrv, Object list, Address data) { SdrList listBuffer; if (!(sdr_in_xn(sdrv))) { oK(_iEnd(file, line, _notInXnMsg())); return; } joinTrace(sdrv, file, line); if (list == 0) { oK(_xniEnd(file, line, "list", sdrv)); return; } sdrFetch(listBuffer, list); listBuffer.userData = data; sdrPut((Address) list, listBuffer); }
Object Sdr_list_create(char *file, int line, Sdr sdrv) { Object list; SdrList listBuffer; if (!(sdr_in_xn(sdrv))) { oK(_iEnd(file, line, _notInXnMsg())); return 0; } joinTrace(sdrv, file, line); list = _sdrzalloc(sdrv, sizeof(SdrList)); if (list == 0) { oK(_iEnd(file, line, "list")); return 0; } sdr_list__clear(&listBuffer); sdrPut((Address) list, listBuffer); return list; }
void Sdr_list_delete(char *file, int line, Sdr sdrv, Object elt, SdrListDeleteFn deleteFn, void *arg) { SdrListElt eltBuffer; Object list; SdrList listBuffer; Object next; Object prev; if (!(sdr_in_xn(sdrv))) { oK(_iEnd(file, line, _notInXnMsg())); return; } joinTrace(sdrv, file, line); if (elt == 0) { oK(_xniEnd(file, line, "elt", sdrv)); return; } sdrFetch(eltBuffer, (Address) elt); if ((list = eltBuffer.list) == 0) { oK(_xniEnd(file, line, "list", sdrv)); return; } sdrFetch(listBuffer, (Address) list); if (listBuffer.length < 1) { oK(_xniEnd(file, line, "list non-empty", sdrv)); return; } next = eltBuffer.next; prev = eltBuffer.prev; if (deleteFn) { deleteFn(sdrv, eltBuffer.data, arg); } /* just in case user accesses later... */ sdr_list__elt_clear(&eltBuffer); sdrPut((Address) elt, eltBuffer); sdrFree(elt); if (prev) { sdrFetch(eltBuffer, (Address) prev); eltBuffer.next = next; sdrPut((Address) prev, eltBuffer); } else { listBuffer.first = next; } if (next) { sdrFetch(eltBuffer, (Address) next); eltBuffer.prev = prev; sdrPut((Address) next, eltBuffer); } else { listBuffer.last = prev; } listBuffer.length -= 1; sdrPut((Address) list, listBuffer); }
Object Sdr_list_insert_after(char *file, int line, Sdr sdrv, Object oldElt, Address data) { SdrListElt oldEltBuffer; Object list; SdrList listBuffer; Object elt; SdrListElt eltBuffer; if (!(sdr_in_xn(sdrv))) { oK(_iEnd(file, line, _notInXnMsg())); return 0; } joinTrace(sdrv, file, line); if (oldElt == 0) { oK(_xniEnd(file, line, "oldElt", sdrv)); return 0; } sdrFetch(oldEltBuffer, (Address) oldElt); if ((list = oldEltBuffer.list) == 0) { oK(_xniEnd(file, line, "list", sdrv)); return 0; } /* create new element */ elt = _sdrzalloc(sdrv, sizeof(SdrListElt)); if (elt == 0) { oK(_iEnd(file, line, "elt")); return 0; } sdr_list__elt_clear(&eltBuffer); eltBuffer.list = list; eltBuffer.data = data; /* insert new element after the specified element */ sdrFetch(listBuffer, (Address) list); eltBuffer.next = oldEltBuffer.next; eltBuffer.prev = oldElt; sdrPut((Address) elt, eltBuffer); if (oldEltBuffer.next != 0) { sdrFetch(eltBuffer, (Address) oldEltBuffer.next); eltBuffer.prev = elt; sdrPut((Address) oldEltBuffer.next, eltBuffer); } else { listBuffer.last = elt; } oldEltBuffer.next = elt; sdrPut((Address) oldElt, oldEltBuffer); listBuffer.length += 1; sdrPut((Address) list, listBuffer); return elt; }