Algorithm-GDiffDelta
view release on metacpan or search on metacpan
GDiffDelta.xs view on Meta::CPAN
MODULE = Algorithm::GDiffDelta PACKAGE = Algorithm::GDiffDelta PREFIX = qefgdiff_
PROTOTYPES: DISABLE
U32
qefgdiff_gdiff_adler32 (U32 init, SV *s)
PREINIT:
STRLEN len;
const unsigned char *buf;
CODE:
buf = (unsigned char *) SvPV(s, len);
RETVAL = adler32(init, buf, len);
OUTPUT:
RETVAL
void
qefgdiff_gdiff_delta (SV *orig, SV *changed, SV *delta)
CODE:
careful_fwrite("\xD1\xFF\xD1\xFF\x04", 5, delta, "delta");
do_delta(orig, changed, delta);
careful_fwrite("\0", 1, delta, "delta");
void
qefgdiff_gdiff_apply (SV *orig, SV *delta, SV *output)
PREINIT:
unsigned char buf[QEF_BUFSZ];
size_t r, s;
int c;
CODE:
/* Check that GDIFF header and version number are valid. */
careful_fread(buf, 5, delta, "delta");
if (buf[0] != 0xD1 || buf[1] != 0xFF ||
buf[2] != 0xD1 || buf[3] != 0xFF)
croak("incorrect GDIFF header at start of delta");
if (buf[4] != 4)
croak("wrong version of GDIFF format (%d),"
" only version 4 understood", (int) buf[4]);
while (1) {
careful_fread(buf, 1, delta, "delta");
c = buf[0];
if (c == 0)
return;
else if (c <= 246) {
careful_fread(buf, c, delta, "delta");
careful_fwrite(buf, c, output, "output");
}
else {
switch (c) {
case 247: /* ushort, <n> bytes - append <n> data bytes */
s = read_ushort(delta);
copy_data(delta, output, s, buf, "delta", "output");
break;
case 248: /* int, <n> bytes - append <n> data bytes */
s = read_int(delta);
copy_data(delta, output, s, buf, "delta", "output");
break;
case 249: /* ushort, ubyte - copy <position>, <length> */
r = read_ushort(delta);
s = read_ubyte(delta);
careful_fseek(orig, r, "original");
copy_data(orig, output, s, buf, "original", "output");
break;
case 250: /* ushort, ushort - copy <position>, <length> */
r = read_ushort(delta);
s = read_ushort(delta);
careful_fseek(orig, r, "original");
copy_data(orig, output, s, buf, "original", "output");
break;
case 251: /* ushort, int - copy <position>, <length> */
r = read_ushort(delta);
s = read_int(delta);
careful_fseek(orig, r, "original");
copy_data(orig, output, s, buf, "original", "output");
break;
case 252: /* int, ubyte - copy <position>, <length> */
r = read_int(delta);
s = read_ubyte(delta);
careful_fseek(orig, r, "original");
copy_data(orig, output, s, buf, "original", "output");
break;
case 253: /* int, ushort - copy <position>, <length> */
r = read_int(delta);
s = read_ushort(delta);
careful_fseek(orig, r, "original");
copy_data(orig, output, s, buf, "original", "output");
break;
case 254: /* int, int - copy <position>, <length> */
r = read_int(delta);
s = read_int(delta);
careful_fseek(orig, r, "original");
copy_data(orig, output, s, buf, "original", "output");
break;
case 255: /* long, int - copy <position>, <length> */
/* TODO - 64 seeking */
assert(0);
break;
default: assert(0);
}
}
}
# vi:ts=4 sw=4 expandtab:
( run in 1.074 second using v1.01-cache-2.11-cpan-f6376fbd888 )