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 )