This source file includes following definitions.
- _zip_buffer_data
- _zip_buffer_free
- _zip_buffer_eof
- _zip_buffer_get
- _zip_buffer_get_16
- _zip_buffer_get_32
- _zip_buffer_get_64
- _zip_buffer_get_8
- _zip_buffer_left
- _zip_buffer_new
- _zip_buffer_new_from_source
- _zip_buffer_offset
- _zip_buffer_ok
- _zip_buffer_put
- _zip_buffer_put_16
- _zip_buffer_put_32
- _zip_buffer_put_64
- _zip_buffer_put_8
- _zip_buffer_set_offset
- _zip_buffer_skip
- _zip_buffer_size
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 #include <stdlib.h>
35 #include <string.h>
36
37 #include "zipint.h"
38
39 zip_uint8_t *
40 _zip_buffer_data(zip_buffer_t *buffer)
41 {
42 return buffer->data;
43 }
44
45
46 void
47 _zip_buffer_free(zip_buffer_t *buffer)
48 {
49 if (buffer == NULL) {
50 return;
51 }
52
53 if (buffer->free_data) {
54 free(buffer->data);
55 }
56
57 free(buffer);
58 }
59
60
61 bool
62 _zip_buffer_eof(zip_buffer_t *buffer)
63 {
64 return buffer->ok && buffer->offset == buffer->size;
65 }
66
67
68 zip_uint8_t *
69 _zip_buffer_get(zip_buffer_t *buffer, zip_uint64_t length)
70 {
71 zip_uint8_t *data;
72
73 if (!buffer->ok || buffer->offset + length < length || buffer->offset + length > buffer->size) {
74 buffer->ok = false;
75 return NULL;
76 }
77
78 data = buffer->data + buffer->offset;
79 buffer->offset += length;
80 return data;
81 }
82
83
84 zip_uint16_t
85 _zip_buffer_get_16(zip_buffer_t *buffer)
86 {
87 zip_uint8_t *data = _zip_buffer_get(buffer, 2);
88
89 if (data == NULL) {
90 return 0;
91 }
92
93 return (zip_uint16_t)(data[0] + (data[1] << 8));
94 }
95
96
97 zip_uint32_t
98 _zip_buffer_get_32(zip_buffer_t *buffer)
99 {
100 zip_uint8_t *data = _zip_buffer_get(buffer, 4);
101
102 if (data == NULL) {
103 return 0;
104 }
105
106 return ((((((zip_uint32_t)data[3] << 8) + data[2]) << 8) + data[1]) << 8) + data[0];
107 }
108
109
110 zip_uint64_t
111 _zip_buffer_get_64(zip_buffer_t *buffer)
112 {
113 zip_uint8_t *data = _zip_buffer_get(buffer, 8);
114
115 if (data == NULL) {
116 return 0;
117 }
118
119 return ((zip_uint64_t)data[7] << 56) + ((zip_uint64_t)data[6] << 48) + ((zip_uint64_t)data[5] << 40) + ((zip_uint64_t)data[4] << 32) + ((zip_uint64_t)data[3] << 24) + ((zip_uint64_t)data[2] << 16) + ((zip_uint64_t)data[1] << 8) + (zip_uint64_t)data[0];
120 }
121
122
123
124 zip_uint8_t
125 _zip_buffer_get_8(zip_buffer_t *buffer)
126 {
127 zip_uint8_t *data = _zip_buffer_get(buffer, 1);
128
129 if (data == NULL) {
130 return 0;
131 }
132
133 return data[0];
134 }
135
136
137 zip_uint64_t
138 _zip_buffer_left(zip_buffer_t *buffer)
139 {
140 return buffer->ok ? buffer->size - buffer->offset : 0;
141 }
142
143
144 zip_buffer_t *
145 _zip_buffer_new(zip_uint8_t *data, zip_uint64_t size)
146 {
147 bool free_data = (data == NULL);
148 zip_buffer_t *buffer;
149
150 if (data == NULL) {
151 if ((data = (zip_uint8_t *)malloc(size)) == NULL) {
152 return NULL;
153 }
154 }
155
156 if ((buffer = (zip_buffer_t *)malloc(sizeof(*buffer))) == NULL) {
157 if (free_data) {
158 free(data);
159 }
160 return NULL;
161 }
162
163 buffer->ok = true;
164 buffer->data = data;
165 buffer->size = size;
166 buffer->offset = 0;
167 buffer->free_data = free_data;
168
169 return buffer;
170 }
171
172
173 zip_buffer_t *
174 _zip_buffer_new_from_source(zip_source_t *src, zip_uint64_t size, zip_uint8_t *buf, zip_error_t *error)
175 {
176 zip_buffer_t *buffer;
177
178 if ((buffer = _zip_buffer_new(buf, size)) == NULL) {
179 zip_error_set(error, ZIP_ER_MEMORY, 0);
180 return NULL;
181 }
182
183 if (_zip_read(src, buffer->data, size, error) < 0) {
184 _zip_buffer_free(buffer);
185 return NULL;
186 }
187
188 return buffer;
189 }
190
191
192 zip_uint64_t
193 _zip_buffer_offset(zip_buffer_t *buffer)
194 {
195 return buffer->ok ? buffer->offset : 0;
196 }
197
198
199 bool
200 _zip_buffer_ok(zip_buffer_t *buffer)
201 {
202 return buffer->ok;
203 }
204
205
206 int
207 _zip_buffer_put(zip_buffer_t *buffer, const void *src, size_t length)
208 {
209 zip_uint8_t *dst = _zip_buffer_get(buffer, length);
210
211 if (dst == NULL) {
212 return -1;
213 }
214
215 memcpy(dst, src, length);
216 return 0;
217 }
218
219
220 int
221 _zip_buffer_put_16(zip_buffer_t *buffer, zip_uint16_t i)
222 {
223 zip_uint8_t *data = _zip_buffer_get(buffer, 2);
224
225 if (data == NULL) {
226 return -1;
227 }
228
229 data[0] = (zip_uint8_t)(i & 0xff);
230 data[1] = (zip_uint8_t)((i >> 8) & 0xff);
231
232 return 0;
233 }
234
235
236 int
237 _zip_buffer_put_32(zip_buffer_t *buffer, zip_uint32_t i)
238 {
239 zip_uint8_t *data = _zip_buffer_get(buffer, 4);
240
241 if (data == NULL) {
242 return -1;
243 }
244
245 data[0] = (zip_uint8_t)(i & 0xff);
246 data[1] = (zip_uint8_t)((i >> 8) & 0xff);
247 data[2] = (zip_uint8_t)((i >> 16) & 0xff);
248 data[3] = (zip_uint8_t)((i >> 24) & 0xff);
249
250 return 0;
251 }
252
253
254 int
255 _zip_buffer_put_64(zip_buffer_t *buffer, zip_uint64_t i)
256 {
257 zip_uint8_t *data = _zip_buffer_get(buffer, 8);
258
259 if (data == NULL) {
260 return -1;
261 }
262
263 data[0] = (zip_uint8_t)(i & 0xff);
264 data[1] = (zip_uint8_t)((i >> 8) & 0xff);
265 data[2] = (zip_uint8_t)((i >> 16) & 0xff);
266 data[3] = (zip_uint8_t)((i >> 24) & 0xff);
267 data[4] = (zip_uint8_t)((i >> 32) & 0xff);
268 data[5] = (zip_uint8_t)((i >> 40) & 0xff);
269 data[6] = (zip_uint8_t)((i >> 48) & 0xff);
270 data[7] = (zip_uint8_t)((i >> 56) & 0xff);
271
272 return 0;
273 }
274
275
276 int
277 _zip_buffer_put_8(zip_buffer_t *buffer, zip_uint8_t i)
278 {
279 zip_uint8_t *data = _zip_buffer_get(buffer, 1);
280
281 if (data == NULL) {
282 return -1;
283 }
284
285 data[0] = i;
286
287 return 0;
288 }
289
290
291 int
292 _zip_buffer_set_offset(zip_buffer_t *buffer, zip_uint64_t offset)
293 {
294 if (offset > buffer->size) {
295 buffer->ok = false;
296 return -1;
297 }
298
299 buffer->ok = true;
300 buffer->offset = offset;
301
302 return 0;
303 }
304
305
306 int
307 _zip_buffer_skip(zip_buffer_t *buffer, zip_uint64_t length) {
308 zip_uint64_t offset = buffer->offset + length;
309
310 if (offset < buffer->offset) {
311 buffer->ok = false;
312 return -1;
313 }
314 return _zip_buffer_set_offset(buffer, offset);
315 }
316
317 zip_uint64_t
318 _zip_buffer_size(zip_buffer_t *buffer)
319 {
320 return buffer->size;
321 }