Exemplo n.º 1
0
int xdlt_load_mmfile(char const *fname, mmfile_t *mf, int binmode) {
	char cc;
	int fd;
	long size;
	char *blk;

	if (xdl_init_mmfile(mf, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) {

		return -1;
	}
	if ((fd = open(fname, O_RDONLY)) == -1) {
		perror(fname);
		xdl_free_mmfile(mf);
		return -1;
	}
	size = lseek(fd, 0, SEEK_END);
	lseek(fd, 0, SEEK_SET);
	if (!(blk = (char *) xdl_mmfile_writeallocate(mf, size))) {
		xdl_free_mmfile(mf);
		close(fd);
		return -1;
	}
	if (read(fd, blk, (size_t) size) != (size_t) size) {
		perror(fname);
		xdl_free_mmfile(mf);
		close(fd);
		return -1;
	}
	close(fd);

	return 0;
}
Exemplo n.º 2
0
int xdlt_change_file(mmfile_t *mfo, mmfile_t *mfr, double rmod,
		     int chmax) {
	long skipln, lnsize, bsize;
	char const *blk, *cur, *top, *eol;
	char lnbuf[XDLT_MAX_LINE_SIZE + 1];

	if (xdl_init_mmfile(mfr, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) {

		return -1;
	}
	if ((blk = xdl_mmfile_first(mfo, &bsize)) != NULL) {
		for (cur = blk, top = blk + bsize, skipln = 0;;) {
			if (cur >= top) {
				if ((blk = xdl_mmfile_next(mfo, &bsize)) == NULL)
					break;
				cur = blk;
				top = blk + bsize;
			}
			if (!(eol = memchr(cur, '\n', top - cur)))
				eol = top;
			if (!skipln) {
				if (DBL_RAND() < rmod) {
					skipln = rand() % chmax;
					if (rand() & 1) {
						for (; skipln > 0; skipln--) {
							lnsize = xdlt_gen_line(lnbuf, XDLT_MAX_LINE_SIZE);
							if (xdl_write_mmfile(mfr, lnbuf, lnsize) != lnsize) {

								xdl_free_mmfile(mfr);
								return -1;
							}
						}
					}
				} else {
					lnsize = (eol - cur) + 1;
					if (xdl_write_mmfile(mfr, cur, lnsize) != lnsize) {

						xdl_free_mmfile(mfr);
						return -1;
					}
				}
			} else
				skipln--;

			cur = eol + 1;
		}
	}

	return 0;
}
Exemplo n.º 3
0
int xdlt_auto_rabinregress(long size, double rmod, int chmax) {
	mmfile_t mf1, mf2, mf2c;

	if (xdlt_create_file(&mf1, size) < 0) {

		return -1;
	}
	if (xdlt_change_file(&mf1, &mf2, rmod, chmax) < 0) {

		xdl_free_mmfile(&mf1);
		return -1;
	}
	if (xdl_mmfile_compact(&mf2, &mf2c, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) {

		xdl_free_mmfile(&mf2);
		xdl_free_mmfile(&mf1);
		return -1;
	}
	xdl_free_mmfile(&mf2);
	if (xdlt_do_rabinregress(&mf1, &mf2c) < 0) {

		xdl_free_mmfile(&mf2c);
		xdl_free_mmfile(&mf1);
		return -1;
	}
	xdl_free_mmfile(&mf2c);
	xdl_free_mmfile(&mf1);

	return 0;
}
Exemplo n.º 4
0
int xdlt_do_rabinregress(mmfile_t *mf1, mmfile_t *mf2) {
	mmfile_t mfp, mfr;

	if (xdlt_do_rabdiff(mf1, mf2, &mfp) < 0) {

		return -1;
	}
	if (xdlt_do_binpatch(mf1, &mfp, &mfr) < 0) {

		xdl_free_mmfile(&mfp);
		return -1;
	}
	if (xdl_mmfile_cmp(&mfr, mf2)) {

		xdl_free_mmfile(&mfr);
		xdl_free_mmfile(&mfp);
		return -1;
	}
	xdl_free_mmfile(&mfr);
	xdl_free_mmfile(&mfp);

	return 0;
}
Exemplo n.º 5
0
int xdlt_auto_regress(xpparam_t const *xpp, xdemitconf_t const *xecfg, long size,
		      double rmod, int chmax) {
	mmfile_t mf1, mf2;

	if (xdlt_create_file(&mf1, size) < 0) {

		return -1;
	}
	if (xdlt_change_file(&mf1, &mf2, rmod, chmax) < 0) {

		xdl_free_mmfile(&mf1);
		return -1;
	}
	if (xdlt_do_regress(&mf1, &mf2, xpp, xecfg) < 0) {

		xdl_free_mmfile(&mf2);
		xdl_free_mmfile(&mf1);
		return -1;
	}
	xdl_free_mmfile(&mf2);
	xdl_free_mmfile(&mf1);

	return 0;
}
Exemplo n.º 6
0
int xdlt_do_binpatch(mmfile_t *mf, mmfile_t *mfp, mmfile_t *mfr) {
	xdemitcb_t ecb;

	if (xdl_init_mmfile(mfr, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) {

		return -1;
	}
	ecb.priv = mfr;
	ecb.outf = xdlt_mmfile_outf;
	if (xdl_bpatch(mf, mfp, &ecb) < 0) {

		xdl_free_mmfile(mfr);
		return -1;
	}

	return 0;
}
Exemplo n.º 7
0
int xdlt_do_rabdiff(mmfile_t *mf1, mmfile_t *mf2, mmfile_t *mfp) {
	xdemitcb_t ecb;

	if (xdl_init_mmfile(mfp, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) {

		return -1;
	}
	ecb.priv = mfp;
	ecb.outf = xdlt_mmfile_outf;
	if (xdl_rabdiff(mf1, mf2, &ecb) < 0) {

		xdl_free_mmfile(mfp);
		return -1;
	}

	return 0;
}
Exemplo n.º 8
0
int xdlt_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
		 xdemitconf_t const *xecfg, mmfile_t *mfp) {
	xdemitcb_t ecb;

	if (xdl_init_mmfile(mfp, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) {

		return -1;
	}
	ecb.priv = mfp;
	ecb.outf = xdlt_mmfile_outf;
	if (xdl_diff(mf1, mf2, xpp, xecfg, &ecb) < 0) {

		xdl_free_mmfile(mfp);
		return -1;
	}

	return 0;
}
Exemplo n.º 9
0
int xdlt_do_regress(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
		    xdemitconf_t const *xecfg) {
	mmfile_t mfp, mfr;

	if (xdlt_do_diff(mf1, mf2, xpp, xecfg, &mfp) < 0) {

		return -1;
	}
	if (xdlt_do_patch(mf1, &mfp, XDL_PATCH_NORMAL, &mfr) < 0) {

		xdl_free_mmfile(&mfp);
		return -1;
	}
	if (xdl_mmfile_cmp(&mfr, mf2)) {

		xdl_free_mmfile(&mfr);
		xdl_free_mmfile(&mfp);
		return -1;
	}
	xdl_free_mmfile(&mfr);
	if (xdlt_do_patch(mf2, &mfp, XDL_PATCH_REVERSE, &mfr) < 0) {

		xdl_free_mmfile(&mfp);
		return -1;
	}
	if (xdl_mmfile_cmp(&mfr, mf1)) {

		xdl_free_mmfile(&mfr);
		xdl_free_mmfile(&mfp);
		return -1;
	}
	xdl_free_mmfile(&mfr);
	xdl_free_mmfile(&mfp);

	return 0;
}
Exemplo n.º 10
0
int xdlt_create_file(mmfile_t *mf, long size) {
	long lnsize, csize;
	char *data;

	if (xdl_init_mmfile(mf, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) {

		return -1;
	}
	if (!(data = xdl_mmfile_writeallocate(mf, size))) {

		xdl_free_mmfile(mf);
		return -1;
	}
	for (csize = 0; size - csize > XDLT_MAX_LINE_SIZE;) {
		lnsize = xdlt_gen_line(data, XDLT_MAX_LINE_SIZE);
		data += lnsize;
		csize += lnsize;
	}
	if (csize < size)
		xdlt_gen_line(data, -(size - csize));

	return 0;
}
Exemplo n.º 11
0
int xdl_mmfile_compact(mmfile_t *mmfo, mmfile_t *mmfc, long bsize, unsigned long flags) {
	long fsize = xdl_mmfile_size(mmfo), size;
	char *data;
	char const *blk;

	if (xdl_init_mmfile(mmfc, bsize, flags) < 0) {

		return -1;
	}
	if (!(data = (char *) xdl_mmfile_writeallocate(mmfc, fsize))) {

		xdl_free_mmfile(mmfc);
		return -1;
	}
	if ((blk = (char const *) xdl_mmfile_first(mmfo, &size)) != NULL) {
		do {
			memcpy(data, blk, size);
			data += size;
		} while ((blk = (char const *) xdl_mmfile_next(mmfo, &size)) != NULL);
	}

	return 0;
}
Exemplo n.º 12
0
int xdlt_do_patch(mmfile_t *mfo, mmfile_t *mfp, int mode, mmfile_t *mfr) {
	xdemitcb_t ecb, rjecb;
	mmfile_t mmfrj;

	if (xdl_init_mmfile(mfr, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) {

		return -1;
	}
	if (xdl_init_mmfile(&mmfrj, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) {

		xdl_free_mmfile(mfr);
		return -1;
	}
	ecb.priv = mfr;
	ecb.outf = xdlt_mmfile_outf;
	rjecb.priv = &mmfrj;
	rjecb.outf = xdlt_mmfile_outf;
	if (xdl_patch(mfo, mfp, mode, &ecb, &rjecb) < 0) {

		xdl_free_mmfile(&mmfrj);
		xdl_free_mmfile(mfr);
		return -1;
	}

	if (mmfrj.fsize > 0) {

#if 1
		xdlt_dump_mmfile("xregr.orig", mfo);
		xdlt_dump_mmfile("xregr.patch", mfp);
		xdlt_dump_mmfile("xregr.rej", &mmfrj);
#endif

		xdl_free_mmfile(&mmfrj);
		xdl_free_mmfile(mfr);
		return -1;
	}
	xdl_free_mmfile(&mmfrj);

	return 0;
}
Exemplo n.º 13
0
value xdiff_diff( value old_data, value new_data, value ctxlen ) 
{
    CAMLparam3 (old_data, new_data, ctxlen);
    CAMLlocal1(dif_data);
    
    mmfile_t mf1, mf2, mf3;
    xdemitcb_t ecb;
    xpparam_t xpp;
    xdemitconf_t xecfg;
    long dif_size;
    

    if (xdlt_store_mmfile(String_val(old_data), string_length(old_data), &mf1) < 0) {
        sprintf(ELINE, "%s:%d failed", __FILE__, __LINE__);
        failwith(ELINE);
    }
    if (xdlt_store_mmfile(String_val(new_data), string_length(new_data), &mf2) < 0) {
        xdl_free_mmfile(&mf1);
        sprintf(ELINE, "%s:%d failed", __FILE__, __LINE__);
        failwith(ELINE);
    }
    if (xdl_init_mmfile(&mf3, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) {
        xdl_free_mmfile(&mf1);
        xdl_free_mmfile(&mf2);
        sprintf(ELINE, "%s:%d failed", __FILE__, __LINE__);
        failwith(ELINE);
    }
    ecb.priv = &mf3;
    ecb.outf = xdlt_outf;
    xpp.flags = 0;
    xecfg.ctxlen = Int_val(ctxlen);

    if (xdl_diff(&mf1, &mf2, &xpp, &xecfg, &ecb) < 0) {
        xdl_free_mmfile(&mf1);
        xdl_free_mmfile(&mf2);
        xdl_free_mmfile(&mf3);
        sprintf(ELINE, "%s:%d failed", __FILE__, __LINE__);
        failwith(ELINE);
    }
    dif_size = xdlt_mmfile_size(&mf3);
    dif_data = alloc_string(dif_size);
    if (xdlt_read_mmfile(String_val(dif_data), &mf3) < 0) {
        xdl_free_mmfile(&mf1);
        xdl_free_mmfile(&mf2);
        xdl_free_mmfile(&mf3);
        sprintf(ELINE, "%s:%d failed", __FILE__, __LINE__);
        failwith(ELINE);
    }
    xdl_free_mmfile(&mf1);
    xdl_free_mmfile(&mf2);
    xdl_free_mmfile(&mf3);

    CAMLreturn(dif_data);
}
Exemplo n.º 14
0
value xdiff_revpatch( value old_data, value patch) 
{
    CAMLparam2 (old_data, patch);
    CAMLlocal1(res);
    mmfile_t mf1, mf2, mf3, mf4;
    xdemitcb_t ecb, rjecb;
    long new_size, rej_size;


    res = alloc_tuple(2);

    if (xdlt_store_mmfile(String_val(old_data), string_length(old_data), &mf1) < 0) {
        sprintf(ELINE, "%s:%d failed", __FILE__, __LINE__);
        failwith(ELINE);
    }
    if (xdlt_store_mmfile(String_val(patch), string_length(patch), &mf2) < 0) {
        xdl_free_mmfile(&mf1);
        sprintf(ELINE, "%s:%d failed", __FILE__, __LINE__);
        failwith(ELINE);
    }
    if (xdl_init_mmfile(&mf3, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) {
        xdl_free_mmfile(&mf1);
        xdl_free_mmfile(&mf2);
        sprintf(ELINE, "%s:%d failed", __FILE__, __LINE__);
        failwith(ELINE);
    }
    if (xdl_init_mmfile(&mf4, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) {
        xdl_free_mmfile(&mf1);
        xdl_free_mmfile(&mf2);
        xdl_free_mmfile(&mf3);
        sprintf(ELINE, "%s:%d failed", __FILE__, __LINE__);
        failwith(ELINE);
    }
    ecb.priv = &mf3;
    ecb.outf = xdlt_outf;
    rjecb.priv = &mf4;
    rjecb.outf = xdlt_outf;

    if (xdl_patch(&mf1, &mf2, XDL_PATCH_REVERSE, &ecb, &rjecb) < 0) {
        xdl_free_mmfile(&mf1);
        xdl_free_mmfile(&mf2);
        xdl_free_mmfile(&mf3);
        xdl_free_mmfile(&mf4);
        sprintf(ELINE, "%s:%d failed", __FILE__, __LINE__);
        failwith(ELINE);
    }
    new_size = xdlt_mmfile_size(&mf3);
    rej_size = xdlt_mmfile_size(&mf4);
    Field(res, 0) = alloc_string(new_size);
    Field(res, 1) = alloc_string(rej_size);
    if (xdlt_read_mmfile(String_val(Field(res, 0)), &mf3) < 0) {
        xdl_free_mmfile(&mf1);
        xdl_free_mmfile(&mf2);
        xdl_free_mmfile(&mf3);
        xdl_free_mmfile(&mf4);
        sprintf(ELINE, "%s:%d failed", __FILE__, __LINE__);
        failwith(ELINE);
    }
    if (xdlt_read_mmfile(String_val(Field(res, 1)), &mf4) < 0) {
        xdl_free_mmfile(&mf1);
        xdl_free_mmfile(&mf2);
        xdl_free_mmfile(&mf3);
        xdl_free_mmfile(&mf4);
        sprintf(ELINE, "%s:%d failed", __FILE__, __LINE__);
        failwith(ELINE);
    }

    xdl_free_mmfile(&mf1);
    xdl_free_mmfile(&mf2);
    xdl_free_mmfile(&mf3);
    xdl_free_mmfile(&mf4);

    CAMLreturn(res);
}
Exemplo n.º 15
0
int xdlt_auto_mbinregress(bdiffparam_t const *bdp, long size,
			  double rmod, int chmax, int n) {
	int i, res;
	mmbuffer_t *mbb;
	mmfile_t *mf, *mfc, *mfx;
	mmfile_t mfn, mff, mfd, mfb;
	xdemitcb_t ecb;

	if ((mbb = (mmbuffer_t *) xdl_malloc((n + 2) * sizeof(mmbuffer_t))) == NULL) {

		return -1;
	}
	if ((mf = mfc = (mmfile_t *) xdl_malloc((n + 2) * sizeof(mmfile_t))) == NULL) {

		xdl_free(mbb);
		return -1;
	}
	if (xdlt_create_file(mfc, size) < 0) {

		xdl_free(mf);
		xdl_free(mbb);
		return -1;
	}
	mbb[0].ptr = (char *) xdl_mmfile_first(mfc, &mbb[0].size);
	mfc++;
	mfx = mf;
	for (i = 0; i < n; i++) {
		if (xdlt_change_file(mfx, &mfn, rmod, chmax) < 0) {

			if (mfx != mf) xdl_free_mmfile(mfx);
			for (; i >= 0; i--)
				xdl_free_mmfile(mf + i);
			xdl_free(mf);
			xdl_free(mbb);
			return -1;
		}
		if (xdl_mmfile_compact(&mfn, &mff, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) {

			xdl_free_mmfile(&mfn);
			if (mfx != mf) xdl_free_mmfile(mfx);
			for (; i >= 0; i--)
				xdl_free_mmfile(mf + i);
			xdl_free(mf);
			xdl_free(mbb);
			return -1;
		}
		xdl_free_mmfile(&mfn);
		if (xdlt_do_bindiff(mfx, &mff, bdp, &mfd) < 0) {

			xdl_free_mmfile(&mff);
			if (mfx != mf) xdl_free_mmfile(mfx);
			for (; i >= 0; i--)
				xdl_free_mmfile(mf + i);
			xdl_free(mf);
			xdl_free(mbb);
			return -1;
		}
		if (mfx != mf) xdl_free_mmfile(mfx);
		mfx = &mfb;
		*mfx = mff;
		if (xdl_mmfile_compact(&mfd, mfc, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) {

			xdl_free_mmfile(&mfd);
			xdl_free_mmfile(mfx);
			for (; i >= 0; i--)
				xdl_free_mmfile(mf + i);
			xdl_free(mf);
			xdl_free(mbb);
			return -1;
		}
		mbb[i + 1].ptr = (char *) xdl_mmfile_first(mfc, &mbb[i + 1].size);
		mfc++;
		xdl_free_mmfile(&mfd);
	}
	if (xdl_init_mmfile(mfc, XDLT_STD_BLKSIZE, XDL_MMF_ATOMIC) < 0) {

		xdl_free_mmfile(mfx);
		for (i = n; i >= 0; i--)
			xdl_free_mmfile(mf + i);
		xdl_free(mf);
		xdl_free(mbb);
		return -1;
	}
	ecb.priv = mfc;
	ecb.outf = xdlt_mmfile_outf;
	if ((res = xdl_bpatch_multi(&mbb[0], &mbb[1], n, &ecb)) == 0)
		res = xdl_mmfile_cmp(mfx, mfc);

	xdl_free_mmfile(mfx);
	for (i = n + 1; i >= 0; i--)
		xdl_free_mmfile(mf + i);
	xdl_free(mf);
	xdl_free(mbb);

	return res;
}