#include "common.h"
#include "mba/diff.h"
int
DiffExamples(int verbose, struct cfg *cfg, char *args[])
{
unsigned char buf[1024], *row[10], *a, *b;
FILE *in;
int ret, t = 1;
struct varray *ses = varray_new(sizeof(struct diff_edit), NULL);
struct varray *ibuf = varray_new(sizeof(int), NULL);
if ((in = fopen(args[0], "r")) == NULL) {
PMNO(errno);
return -1;
}
while ((ret = csv_row_fread(in, buf, 1024, row, 10, ',', CSV_QUOTES | CSV_TRIM)) > 0) {
int n, m, d, sn, i;
unsigned char tmp[1024], *p;
struct diff_edit *e;
a = row[2];
b = row[3];
n = strlen(a);
m = strlen(b);
if ((d = diff(a, 0, n, b, 0, m, NULL, NULL, NULL, 0, ses, &sn, ibuf)) == -1) {
AMSG("");
return -1;
}
if (d != atoi(row[0])) {
PMSG("%d: edit distance incorrect: expected=%d result=%d: %s %s\n", t, atoi(row[0]), d, a, b);
return -1;
} else if (sn != atoi(row[1])) {
PMSG("%d: script length incorrect: expected=%d result=%d: %s %s\n", t, atoi(row[1]), sn, a, b);
return -1;
}
p = tmp;
for (i = 0; i < sn; i++) {
e = varray_get(ses, i);
if (e->op == DIFF_MATCH || e->op == DIFF_INSERT) {
memcpy(p, (e->op == DIFF_MATCH ? a : b) + e->off, e->len);
p += e->len;
}
}
if ((p - tmp) != m || memcmp(b, tmp, m)) {
PMSG("%d: invalid script: %d != %d: %s ->", t, (p - tmp), m, b);
fwrite(tmp, 1, m, stderr);
fputc('\n', stderr);
return -1;
}
tcase_printf(verbose, "%d: %d %d %-15s --> %-15s\n", t++, d, sn, a, b);
}
fclose(in);
cfg = NULL;
return ret;
}
syntax highlighted by Code2HTML, v. 0.9.1