Using Zlib with XVR

The Zlib can be used for compressing data inside XVR. The features of this library are not available directly in XVR but is possible to invoke them by using the CVmExternDll mechanism.

This script performs the trick, remembering that the decompression requires a previous knowledge of the size.

#include <Script3d.h>

function compress(s,db)
{
        static var zlib;
        if(zlib == Void)
        {
                zlib = CVmExternDll("zlib.dll");
                zlib.__AddFunction(C_INT,"compress",C_PSTR,C_PINT,C_PSTR,C_INT);
        }
        var r = valtype(db) == "S" ? db : Space(len(s)*(1.01)+12);
        var q = len(r);
        var qr = zlib.compress(&r,&q,s,len(s));
        return qr == 0 ? (len(r) == q ? r : left(r,q)) : Void;
}

function uncompress(s,n)
{
        static var zlib;
        if(zlib == Void)
        {
                zlib = CVmExternDll("zlib.dll");
                zlib.__AddFunction(C_INT,"uncompress",C_PSTR,C_PINT,C_PSTR,C_INT);
        }
        var r = valtype(n) =="S" ? n : Space(n);
        var q = len(r);
        var qr = zlib.uncompress(&r,&q,s,len(s));
        return qr == 0 ? (q == len(r) ? r : left(r,q)) : Void;
}

function OnInit()
{
        SetLocalDir(".");
        var o = "Ciao";
        var c = compress(o);
        var d = uncompress(c,len(o));
        OutputLN("lengths ",len(o)," ",len(c)," ",len(d));
}

ExternDLL