- /* Construct the diff
- function printDiff(C[0..m,0..n], X[1..m], Y[1..n], i, j)
- if i > 0 and j > 0 and X[i] = Y[j]
- printDiff(C, X, Y, i-1, j-1)
- print " " + X[i]
- else
- if j > 0 and (i = 0 or C[i,j-1] >= C[i-1,j])
- printDiff(C, X, Y, i, j-1)
- print "+ " + Y[j]
- else if i > 0 and (j = 0 or C[i,j-1] < C[i-1,j])
- printDiff(C, X, Y, i-1, j)
- print "- " + X[i]
- */
-
- if (i >= 0 && j >= 0 && !strcmp(xbt_dynar_get_as(da, i, char *),
- xbt_dynar_get_as(db, j, char *))) {
- diff_build_diff(res, C, da, db, i - 1, j - 1);
- diff_push(res, ' ', xbt_dynar_get_as(da, i, char *));
- } else if (j >= 0 &&
- (i == -1 || diff_get(C, i, j - 1) >= diff_get(C, i - 1, j))) {
- diff_build_diff(res, C, da, db, i, j - 1);
- diff_push(res, '+', xbt_dynar_get_as(db, j, char *));
- } else if (i >= 0 &&
- (j == -1 || diff_get(C, i, j - 1) < diff_get(C, i - 1, j))) {
- diff_build_diff(res, C, da, db, i - 1, j);
- diff_push(res, '-', xbt_dynar_get_as(da, i, char *));
+ int a0 = *a0_p;
+ int b0 = *b0_p;
+ int len_a = *len_a_p;
+ int len_b = *len_b_p;
+
+ while (len_a > 0 && len_b > 0){
+ struct subsequence subseq;
+ subseq.len = 0;
+ while (len_a > 0 && len_b > 0 &&
+ !strcmp(vec_a[a0 + len_a - 1], vec_b[b0 + len_b - 1])) {
+ len_a--;
+ len_b--;
+ subseq.len++;
+ }
+ if (subseq.len > 0) {
+ subseq.x = a0 + len_a;
+ subseq.y = b0 + len_b;
+ xbt_dynar_push(common_suffix, &subseq);
+ }
+ if (len_a > 0 && len_b > 0 &&
+ !diff_member(vec_b[b0 + len_b - 1], vec_a, a0, a0 + len_a - 1)) {
+ len_b--;
+ } else {
+ break;
+ }