Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
7640 views
1
#include "mupdf/fitz.h"
2
3
#include <zlib.h>
4
5
typedef struct fz_leech_s fz_leech;
6
7
struct fz_leech_s
8
{
9
fz_stream *chain;
10
fz_buffer *buffer;
11
};
12
13
static int
14
next_leech(fz_context *ctx, fz_stream *stm, int max)
15
{
16
fz_leech *state = stm->state;
17
fz_buffer *buffer = state->buffer;
18
int n = fz_available(ctx, state->chain, max);
19
20
if (n > max)
21
n = max;
22
23
while (buffer->cap < buffer->len + n)
24
{
25
fz_grow_buffer(ctx, state->buffer);
26
}
27
memcpy(buffer->data + buffer->len, state->chain->rp, n);
28
stm->rp = buffer->data + buffer->len;
29
stm->wp = buffer->data + buffer->len + n;
30
state->chain->rp += n;
31
buffer->len += n;
32
33
if (n == 0)
34
return EOF;
35
return *stm->rp++;
36
}
37
38
static void
39
close_leech(fz_context *ctx, void *state_)
40
{
41
fz_leech *state = (fz_leech *)state_;
42
43
fz_drop_stream(ctx, state->chain);
44
fz_free(ctx, state);
45
}
46
47
fz_stream *
48
fz_open_leecher(fz_context *ctx, fz_stream *chain, fz_buffer *buffer)
49
{
50
fz_leech *state = NULL;
51
52
fz_var(state);
53
54
fz_try(ctx)
55
{
56
state = fz_malloc_struct(ctx, fz_leech);
57
state->chain = chain;
58
state->buffer = buffer;
59
}
60
fz_catch(ctx)
61
{
62
fz_free(ctx, state);
63
fz_drop_stream(ctx, chain);
64
fz_rethrow(ctx);
65
}
66
return fz_new_stream(ctx, state, next_leech, close_leech);
67
}
68
69