blob: 4bae0cd06c5237a3a9be9b470e2fc4852f1a6072 (
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
%% options
copyright owner = Dirk Krause
copyright year = 2011-xxxx
license = bsd
%% module
#include "dk3all.h"
$(trace-include)
/** Low-level stream function to deal with bzip2 compression.
Closing the stream also closes the bzip2-file.
@param api API structure.
*/
static
void
dk3stream_bz_fct(dk3_stream_api_t *api)
{
#if DK3_HAVE_BZLIB_H
BZFILE *b = NULL; /* Low level I/O object. */
int res = 0; /* Operation result. */
#endif
api->suc = 0;
(api->res).sz = 0;
(api->res).ec = DK3_ERROR_NOT_SUPPORTED;
#if DK3_HAVE_BZLIB_H
b = (BZFILE *)((api->arg).d);
(api->res).ec = 0;
switch(api->cmd) {
case DK3_STREAM_API_READ: {
if(((api->arg).b) && ((api->arg).sz) && ((api->arg).d)) {
res = BZ2_bzread(b, (api->arg).b, (int)((api->arg).sz));
if(res > 0) {
api->suc = 1; (api->res).ec = 0; (api->res).sz = (size_t)res;
}
}
} break;
case DK3_STREAM_API_WRITE: {
if(((api->arg).b) && ((api->arg).sz) && ((api->arg).d)) {
res = BZ2_bzwrite(b, (api->arg).b, (int)((api->arg).sz));
if(res > 0) {
(api->res).sz = (size_t)res;
if((size_t)res == (api->arg).sz) {
api->suc = 1; (api->res).ec = 0;
}
}
}
} break;
case DK3_STREAM_API_FLUSH: {
if((api->arg).d) {
BZ2_bzflush(b);
api->suc = 1; (api->res).ec = 0;
/*
As the library manual explains BZ2_bzflush() does nothing.
So we always return success.
*/
}
} break;
case DK3_STREAM_API_AT_END: {
} break;
case DK3_STREAM_API_CLOSE: {
if((api->arg).d) {
BZ2_bzclose(b);
api->suc = 1; (api->res).ec = 0;
}
} break;
case DK3_STREAM_API_ZERO_IS_END: {
api->suc = 1; (api->res).ec = 0; /* Correct if necessary */
} break;
case DK3_STREAM_API_ERROR: {
} break;
}
#endif
}
/** Low-level stream function to deal with bzip2 compression.
Closing the stream does not close the bzip2 file.
@param api API structure.
*/
static
void
dk3stream_bz_fct_no_close(dk3_stream_api_t *api)
{
if(api->cmd != DK3_STREAM_API_CLOSE) {
dk3stream_bz_fct(api);
} else {
api->suc = 1; (api->res).ec = 0;
}
}
#if DK3_HAVE_BZLIB_H
/** Open a stream for an existing BZFILE.
@param b BZFILE already opened.
@param fl Read/write flags.
@param app Application structure for diagnostics, may be NULL.
@return Pointer to new stream on success, NULL on error.
*/
dk3_stream_t *
dk3stream_open_bz2_app(BZFILE *b, int fl, dk3_app_t *app)
{
dk3_stream_t *back = NULL;
if(b) {
back = dk3stream_open_app((void *)b, dk3stream_bz_fct_no_close, fl, app);
}
return back;
}
#endif
/* vim: set ai sw=2 : */
|