long xdl_guess_lines(mmfile_t *mf) { long nl = 0, size, tsize = 0; char const *data, *cur, *top; if ((cur = data = xdl_mmfile_first(mf, &size)) != NULL) { for (top = data + size; nl < XDL_GUESS_NLINES;) { if (cur >= top) { tsize += (long) (cur - data); if (!(cur = data = xdl_mmfile_next(mf, &size))) break; top = data + size; } nl++; if (!(cur = memchr(cur, '\n', top - cur))) cur = top; else cur++; } tsize += (long) (cur - data); } if (nl && tsize) nl = xdl_mmfile_size(mf) / (tsize / nl); return nl + 1; }
int xdl_mmfile_cmp(mmfile_t *mmf1, mmfile_t *mmf2) { int cres; long size, bsize1, bsize2, size1, size2; char const *blk1, *cur1, *top1 = NULL; char const *blk2, *cur2, *top2 = NULL; if ((cur1 = blk1 = (char const *)xdl_mmfile_first(mmf1, &bsize1)) != NULL) top1 = blk1 + bsize1; if ((cur2 = blk2 = (char const *)xdl_mmfile_first(mmf2, &bsize2)) != NULL) top2 = blk2 + bsize2; if (!cur1) { if (!cur2 || xdl_mmfile_size(mmf2) == 0) return 0; return -*cur2; } else if (!cur2) return xdl_mmfile_size(mmf1) ? *cur1: 0; for (;;) { if (cur1 >= top1) { if ((cur1 = blk1 = (char const *)xdl_mmfile_next(mmf1, &bsize1)) != NULL) top1 = blk1 + bsize1; } if (cur2 >= top2) { if ((cur2 = blk2 = (char const *)xdl_mmfile_next(mmf2, &bsize2)) != NULL) top2 = blk2 + bsize2; } if (!cur1) { if (!cur2) break; return -*cur2; } else if (!cur2) return *cur1; size1 = top1 - cur1; size2 = top2 - cur2; size = XDL_MIN(size1, size2); if ((cres = memcmp(cur1, cur2, size)) != 0) return cres; cur1 += size; cur2 += size; } return 0; }
long xdl_guess_lines(mmfile_t *mf, long sample) { long nl = 0, size, tsize = 0; char const *data, *cur, *top; if ((cur = data = xdl_mmfile_first(mf, &size)) != NULL) { for (top = data + size; nl < sample && cur < top; ) { nl++; if (!(cur = memchr(cur, '\n', top - cur))) cur = top; else cur++; } tsize += (long) (cur - data); } if (nl && tsize) nl = xdl_mmfile_size(mf) / (tsize / nl); return nl + 1; }
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; }
int xdl_bpatch(mmfile_t *mmf, mmfile_t *mmfp, xdemitcb_t *ecb) { long size, off, csize, osize; unsigned long fp, ofp; char const *blk; unsigned char const *data, *top; mmbuffer_t mb; if ((blk = (char const *) xdl_mmfile_first(mmfp, &size)) == NULL || size < XDL_BPATCH_HDR_SIZE) { return -1; } ofp = xdl_mmf_adler32(mmf); osize = xdl_mmfile_size(mmf); XDL_LE32_GET(blk, fp); XDL_LE32_GET(blk + 4, csize); if (fp != ofp || csize != osize) { return -1; } blk += XDL_BPATCH_HDR_SIZE; size -= XDL_BPATCH_HDR_SIZE; do { for (data = (unsigned char const *) blk, top = data + size; data < top;) { if (*data == XDL_BDOP_INS) { data++; mb.size = (long) *data++; mb.ptr = (char *) data; data += mb.size; if (ecb->outf(ecb->priv, &mb, 1) < 0) { return -1; } } else if (*data == XDL_BDOP_INSB) { data++; XDL_LE32_GET(data, csize); data += 4; mb.size = csize; mb.ptr = (char *) data; data += mb.size; if (ecb->outf(ecb->priv, &mb, 1) < 0) { return -1; } } else if (*data == XDL_BDOP_CPY) { data++; XDL_LE32_GET(data, off); data += 4; XDL_LE32_GET(data, csize); data += 4; if (xdl_copy_range(mmf, off, csize, ecb) < 0) { return -1; } } else { return -1; } } } while ((blk = (char const *) xdl_mmfile_next(mmfp, &size)) != NULL); return 0; }