static int rle_unpack(const unsigned char *src, int src_len, int src_count,

                      unsigned char *dest, int dest_len)

{

    const unsigned char *ps;

    const unsigned char *ps_end;

    unsigned char *pd;

    int i, l;

    unsigned char *dest_end = dest + dest_len;



    ps = src;

    ps_end = src + src_len;

    pd = dest;

    if (src_count & 1) {

        if (ps_end - ps < 1)

            return 0;

        *pd++ = *ps++;

    }



    src_count >>= 1;

    i = 0;

    do {

        if (ps_end - ps < 1)

            break;

        l = *ps++;

        if (l & 0x80) {

            l = (l & 0x7F) * 2;

            if (pd + l > dest_end || ps_end - ps < l)

                return ps - src;

            memcpy(pd, ps, l);

            ps += l;

            pd += l;

        } else {

            if (pd + i > dest_end || ps_end - ps < 2)

                return ps - src;

            for (i = 0; i < l; i++) {

                *pd++ = ps[0];

                *pd++ = ps[1];

            }

            ps += 2;

        }

        i += l;

    } while (i < src_count);



    return ps - src;

}

static int rle_unpack(const unsigned char *src, int src_len, int src_count,

                      unsigned char *dest, int dest_len)

{

    const unsigned char *ps;

    const unsigned char *ps_end;

    unsigned char *pd;

    int i, l;

    unsigned char *dest_end = dest + dest_len;



    ps = src;

    ps_end = src + src_len;

    pd = dest;

    if (src_count & 1) {

        if (ps_end - ps < 1)

            return 0;

        *pd++ = *ps++;

    }



    src_count >>= 1;

    i = 0;

    do {

        if (ps_end - ps < 1)

            break;

        l = *ps++;

        if (l & 0x80) {

            l = (l & 0x7F) * 2;

            if (pd + l > dest_end || ps_end - ps < l)

                return ps - src;

            memcpy(pd, ps, l);

            ps += l;

            pd += l;

        } else {

            if (pd + i > dest_end || ps_end - ps < 2)

                return ps - src;

            for (i = 0; i < l; i++) {

                *pd++ = ps[0];

                *pd++ = ps[1];

            }

            ps += 2;

        }

        i += l;

    } while (i < src_count);



    return ps - src;

}

            if (pd + l > dest_end || ps_end - ps < l)             if (pd + i > dest_end || ps_end - ps < 2)
static int FUNC_0(const unsigned char *VAR_0, int VAR_1, int VAR_2,

                      unsigned char *VAR_3, int VAR_4)

{

    const unsigned char *VAR_5;

    const unsigned char *VAR_6;

    unsigned char *VAR_7;

    int VAR_8, VAR_9;

    unsigned char *VAR_10 = VAR_3 + VAR_4;



    VAR_5 = VAR_0;

    VAR_6 = VAR_0 + VAR_1;

    VAR_7 = VAR_3;

    if (VAR_2 & 1) {

        if (VAR_6 - VAR_5 < 1)

            return 0;

        *VAR_7++ = *VAR_5++;

    }



    VAR_2 >>= 1;

    VAR_8 = 0;

    do {

        if (VAR_6 - VAR_5 < 1)

            break;

        VAR_9 = *VAR_5++;

        if (VAR_9 & 0x80) {

            VAR_9 = (VAR_9 & 0x7F) * 2;

            if (VAR_7 + VAR_9 > VAR_10 || VAR_6 - VAR_5 < VAR_9)

                return VAR_5 - VAR_0;

            memcpy(VAR_7, VAR_5, VAR_9);

            VAR_5 += VAR_9;

            VAR_7 += VAR_9;

        } else {

            if (VAR_7 + VAR_8 > VAR_10 || VAR_6 - VAR_5 < 2)

                return VAR_5 - VAR_0;

            for (VAR_8 = 0; VAR_8 < VAR_9; VAR_8++) {

                *VAR_7++ = VAR_5[0];

                *VAR_7++ = VAR_5[1];

            }

            VAR_5 += 2;

        }

        VAR_8 += VAR_9;

    } while (VAR_8 < VAR_2);



    return VAR_5 - VAR_0;

}

static int FUNC_0(const unsigned char *VAR_0, int VAR_1, int VAR_2,
unsigned char *VAR_3, int VAR_4)
{ const unsigned char *VAR_5; const unsigned char *VAR_6; unsigned char *VAR_7; int VAR_8, VAR_9; unsigned char *VAR_10 = VAR_3 + VAR_4; VAR_5 = VAR_0; VAR_6 = VAR_0 + VAR_1; VAR_7 = VAR_3; if (VAR_2 & 1) { if (VAR_6 - VAR_5 < 1)
return 0; *VAR_7++ = *VAR_5++; } VAR_2 >>= 1; VAR_8 = 0; do { if (VAR_6 - VAR_5 < 1)
break; VAR_9 = *VAR_5++; if (VAR_9 & 0x80) { VAR_9 = (VAR_9 & 0x7F) * 2; if (VAR_7 + VAR_9 > VAR_10 || VAR_6 - VAR_5 < VAR_9)
return VAR_5 - VAR_0; memcpy(VAR_7, VAR_5, VAR_9); VAR_5 += VAR_9; VAR_7 += VAR_9; } else { if (VAR_7 + VAR_8 > VAR_10 || VAR_6 - VAR_5 < 2)
return VAR_5 - VAR_0; for (VAR_8 = 0; VAR_8 < VAR_9; VAR_8++) { *VAR_7++ = VAR_5[0]; *VAR_7++ = VAR_5[1]; } VAR_5 += 2; } VAR_8 += VAR_9; } while (VAR_8 < VAR_2); return VAR_5 - VAR_0; }