static rfbBool sraSpanListEqual(const sraSpanList *s1, const sraSpanList *s2) { sraSpan *sp1, *sp2; if (!s1) { if (!s2) { return 1; } else { printf("sraSpanListEqual:incompatible spans (only one NULL!)\n"); return FALSE; } } sp1 = s1->front._next; sp2 = s2->front._next; while ((sp1 != &(s1->back)) && (sp2 != &(s2->back))) { if ((sp1->start != sp2->start) || (sp1->end != sp2->end) || (!sraSpanListEqual(sp1->subspan, sp2->subspan))) { return 0; } sp1 = sp1->_next; sp2 = sp2->_next; } if ((sp1 == &(s1->back)) && (sp2 == &(s2->back))) { return 1; } else { return 0; } }
static void sraSpanMergePrevious(sraSpan *dest) { sraSpan *prev; if (!dest) return; prev = dest->_prev; while ((prev->_prev) && (prev->end == dest->start) && (sraSpanListEqual(prev->subspan, dest->subspan))) { /* printf("merge_prev:"); sraSpanPrint(prev); printf(" & "); sraSpanPrint(dest); printf("\n"); */ dest->start = prev->start; sraSpanRemove(prev); sraSpanDestroy(prev); prev = dest->_prev; } }
static void sraSpanMergeNext(sraSpan *dest) { sraSpan *next = dest->_next; while ((next->start == dest->end) && (next->_next) && (sraSpanListEqual(next->subspan, dest->subspan))) { /* printf("merge_next:"); sraSpanPrint(dest); printf(" & "); sraSpanPrint(next); printf("\n"); */ dest->end = next->end; sraSpanRemove(next); sraSpanDestroy(next); next = dest->_next; } }