static void diffRecursively (TextDiff& td, const StringRegion& a, const StringRegion& b) { int indexA, indexB; const int len = findLongestCommonSubstring (a.text, a.length, b.text, b.length, indexA, indexB); if (len >= minLengthToMatch) { if (indexA > 0 && indexB > 0) diffSkippingCommonStart (td, StringRegion (a.text, a.start, indexA), StringRegion (b.text, b.start, indexB)); else if (indexA > 0) addDeletion (td, b.start, indexA); else if (indexB > 0) addInsertion (td, b.text, b.start, indexB); diffRecursively (td, StringRegion (a.text + indexA + len, a.start + indexA + len, a.length - indexA - len), StringRegion (b.text + indexB + len, b.start + indexB + len, b.length - indexB - len)); } else { if (a.length > 0) addDeletion (td, b.start, a.length); if (b.length > 0) addInsertion (td, b.text, b.start, b.length); } }
static double testInsertFast (tree *tr, nodeptr p, nodeptr q, insertions *ins, boolean veryFast) { double qz[NUM_BRANCHES], pz[NUM_BRANCHES]; nodeptr r, s; double LH; int i; r = q->back; for(i = 0; i < tr->numBranches; i++) { qz[i] = q->z[i]; pz[i] = p->z[i]; } insertFast(tr, p, q, tr->numBranches); evaluateGeneric(tr, p->next->next); addInsertion(q, tr->likelihood, ins); if(veryFast) if(tr->likelihood > tr->endLH) { tr->insertNode = q; tr->removeNode = p; for(i = 0; i < tr->numBranches; i++) tr->currentZQR[i] = tr->zqr[i]; tr->endLH = tr->likelihood; } LH = tr->likelihood; hookup(q, r, qz, tr->numBranches); p->next->next->back = p->next->back = (nodeptr) NULL; if(Thorough) { s = p->back; hookup(p, s, pz, tr->numBranches); } return LH; }