aboutsummaryrefslogtreecommitdiff
path: root/src/base/flate/write.c
blob: 3f07b9472a878845ea3cf05a2003fe08b8b7cfc6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "internal.h"

int
flate·write(flate·Writer *wtr, int sz, int n, void *buf)
{
    int r;
    int err;
    flate·Writer zwtr;

    zwtr = *wtr;
    zwtr.next_out  = buf;
DEFLATE:
    zwtr.avail_out = n*sz;
    err = deflate(&zwtr.z, Z_NO_FLUSH);

    switch (err) {
    case Z_STREAM_END:
        return n;

    case Z_OK:
        r  = (zwtr.next_out - (ubyte*)buf)/sz;
        n -= r;
        if (!n) {
            return r;
        }
        buf += n;
        goto DEFLATE;

    case Z_STREAM_ERROR:
        errorf("zlib: bad input");
        goto ERROR;

    case Z_BUF_ERROR:
        if (!zwtr.avail_in) {
            zwtr.avail_in += zwtr.wtr.write(zwtr.impl, 1, arrlen(zwtr.buf), buf);
            if (!zwtr.avail_in) {
                errorf("reader: failed read");
                goto ERROR;
            }
            goto DEFLATE;
        }
    }

    return 0;
ERROR:
    errorf("zlib: %s", zwtr.msg);
    return -1;
}