source: lib/ior-zlib.c @ 7f2612c

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 7f2612c was 7f2612c, checked in by Shane Alcock <salcock@…>, 12 years ago
  • Can't use errno without errno.h!
  • Property mode set to 100644
File size: 2.5 KB
Line 
1#include <zlib.h>
2#include "wandio.h"
3#include <sys/types.h>
4#include <sys/stat.h>
5#include <fcntl.h>
6#include <stdlib.h>
7#include <string.h>
8#include <errno.h>
9
10enum err_t {
11        ERR_OK  = 1,
12        ERR_EOF = 0,
13        ERR_ERROR = -1
14};
15
16struct zlib_t {
17        z_stream strm;
18        Bytef inbuff[1024*1024]; /* bytef is what zlib uses for buffer pointers */
19        io_t *parent;
20        int outoffset;
21        enum err_t err;
22};
23
24
25extern io_source_t zlib_source; 
26
27#define DATA(io) ((struct zlib_t *)((io)->data))
28#define min(a,b) ((a)<(b) ? (a) : (b))
29
30io_t *zlib_open(io_t *parent)
31{
32        io_t *io;
33        if (!parent)
34                return NULL;
35        io = malloc(sizeof(io_t));
36        io->source = &zlib_source;
37        io->data = malloc(sizeof(struct zlib_t));
38
39        DATA(io)->parent = parent;
40
41        DATA(io)->strm.next_in = NULL;
42        DATA(io)->strm.avail_in = 0;
43        DATA(io)->strm.next_out = NULL;
44        DATA(io)->strm.avail_out = 0;
45        DATA(io)->strm.zalloc = Z_NULL;
46        DATA(io)->strm.zfree = Z_NULL;
47        DATA(io)->strm.opaque = NULL;
48        DATA(io)->err = ERR_OK;
49
50        inflateInit2(&DATA(io)->strm, 15 | 32);
51
52        return io;
53}
54
55
56static off_t zlib_read(io_t *io, void *buffer, off_t len)
57{
58        if (DATA(io)->err == ERR_EOF)
59                return 0; /* EOF */
60        if (DATA(io)->err == ERR_ERROR) {
61                errno=EIO;
62                return -1; /* ERROR! */
63        }
64
65        DATA(io)->strm.avail_out = len;
66        DATA(io)->strm.next_out = (Bytef*)buffer;
67
68        while (DATA(io)->err == ERR_OK && DATA(io)->strm.avail_out > 0) {
69                while (DATA(io)->strm.avail_in <= 0) {
70                        int bytes_read = wandio_read(DATA(io)->parent, 
71                                (char*)DATA(io)->inbuff,
72                                sizeof(DATA(io)->inbuff));
73                        if (bytes_read == 0) /* EOF */
74                                return len-DATA(io)->strm.avail_out;
75                        if (bytes_read < 0) { /* Error */
76                                /* errno should be set */
77                                DATA(io)->err = ERR_ERROR;
78                                /* Return how much data we managed to read ok */
79                                if (DATA(io)->strm.avail_out != len) {
80                                        return len-DATA(io)->strm.avail_out;
81                                }
82                                /* Now return error */
83                                return -1;
84                        }
85                        DATA(io)->strm.next_in = DATA(io)->inbuff;
86                        DATA(io)->strm.avail_in = bytes_read;
87                }
88                /* Decompress some data into the output buffer */
89                int err=inflate(&DATA(io)->strm, 0);
90                switch(err) {
91                        case Z_OK:
92                                DATA(io)->err = ERR_OK;
93                                break;
94                        case Z_STREAM_END:
95                                DATA(io)->err = ERR_EOF;
96                                break;
97                        default:
98                                errno=EIO;
99                                DATA(io)->err = ERR_ERROR;
100                }
101        }
102        /* Return the number of bytes decompressed */
103        return len-DATA(io)->strm.avail_out;
104}
105
106static void zlib_close(io_t *io)
107{
108        inflateEnd(&DATA(io)->strm);
109        wandio_destroy(DATA(io)->parent);
110        free(io->data);
111        free(io);
112}
113
114io_source_t zlib_source = {
115        "zlib",
116        zlib_read,
117        NULL,   /* peek */
118        NULL,   /* tell */
119        NULL,   /* seek */
120        zlib_close
121};
122
Note: See TracBrowser for help on using the repository browser.