void lcs_LCS(obj, s1, s2) SV *obj AV * s1 AV * s2 PREINIT: struct CTX *ctx = (struct CTX *)SvIVX(SvRV(obj)); PPCODE: int d, sn, i; struct varray *ses = varray_new(sizeof(struct diff_edit), NULL); IV n; IV m; n = av_top_index(s1); m = av_top_index(s2); d = diff(s1, 0, n+1, s2, 0, m+1, &_cmp_idx, NULL, 0, ses, &sn, NULL); int x,y,j; x=y=0; XSprePUSH; for (i = 0; i < sn; i++) { struct diff_edit *e = varray_get(ses, i); switch (e->op) { case DIFF_MATCH: //printf("MAT: "); //printf("off %d len %d\n", e->off, e->len); for (j = 0; j < e->len; j++) { //printf("x %d y %d\n", x, y); AV *arr; arr = newAV(); av_push(arr, newSViv(x)); av_push(arr, newSViv(y)); XPUSHs(sv_2mortal(newRV_noinc((SV *)arr))); x++; y++; } break; case DIFF_DELETE: //printf("DEL: "); //printf("off %d len %d\n", e->off, e->len); for (j = 0; j < e->len; j++) { x++; } break; case DIFF_INSERT: //printf("INS: "); //printf("off %d len %d\n", e->off, e->len); for (j = 0; j < e->len; j++) { y++; } break; } } varray_del(ses);